File: vec_itr_speed.sh

package info (click to toggle)
cppad 2026.00.00.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 11,584 kB
  • sloc: cpp: 112,960; sh: 6,146; ansic: 179; python: 71; sed: 12; makefile: 10
file content (174 lines) | stat: -rwxr-xr-x 5,384 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
#! /bin/bash -e
# SPDX-License-Identifier: EPL-2.0 OR GPL-2.0-or-later
# SPDX-FileCopyrightText: Bradley M. Bell <bradbell@seanet.com>
# SPDX-FileContributor: 2003-22 Bradley M. Bell
# ----------------------------------------------------------------------------
name=`echo $0 | sed -e 's|^bug/||' -e 's|\.sh$||'`
error='none'
if [ "$0" != "bug/$name.sh" ]
then
   echo "program name is not bug/$name.sh"
   ok='no'
fi
compiler="$1"
if [ "$compiler" != 'g++' ] && [ "$compiler" != 'clang++' ]
then
   if [ "$compiler" != '' ]
   then
      echo 'compiler is not g++ or clang++'
   fi
   ok='no'
fi
debug="$2"
if [ "$debug" != 'yes' ] && [ "$debug" != 'no' ]
then
   if [ "$debug" != '' ]
   then
      echo 'debug is not yes or no'
   fi
   ok='no'
fi
opt_level="$3"
if [[ "$opt_level" =~ "[^0-3]" ]]
then
   if [ "$opt_level" != '' ]
   then
      echo 'opt_level is not 0, 1, 2, or 3'
   fi
   ok='no'
fi
if [ "$ok" == 'no' ]
then
   echo
   echo "usage: bug/$name.sh compiler debug opt_level"
   echo 'compiler is:  g++ or clang++'
   echo 'debug is:     yes or no'
   echo 'opt_level is: 0, 1, 2, or 3.'
   exit 1
fi
# -----------------------------------------------------------------------------
if [ -e build/bug ]
then
   rm -r build/bug
fi
mkdir -p build/bug
cd build/bug
# cmake ../..
# -----------------------------------------------------------------------------
cat << EOF
This is speed test (not a bug report) comparing the speed using CppAD vector
iterators and raw pointer with the algorithms std::sort and std::reverse.
EOF
cat << EOF > $name.cpp
# include <cppad/utility/vector.hpp>
# include <cppad/utility/time_test.hpp>
namespace {
   // declared here so setup does not include allocation
   CppAD::vector<size_t> vec;
   // ----------------------------------------------------------------------
   // sort test functions
   void sort_itr(size_t size, size_t repeat)
   {  // size and vec.size() are equal
      size_t* data = vec.data();
      while( repeat-- )
      {  // sort a vector that is not in order
         for(size_t i = 0; i < size; ++i)
            data[i] = (size - i) % 21;
         std::sort(vec.begin(), vec.end());
      }
   }
   void sort_ptr(size_t size, size_t repeat)
   {  // size and vec.size() are equal
      size_t* data = vec.data();
      while( repeat-- )
      {  // sort same vector as in sort_itr
         for(size_t i = 0; i < size; ++i)
            data[i] = (size - i) % 21;
         std::sort(vec.data(), vec.data() + vec.size());
      }
   }
   // ----------------------------------------------------------------------
   // reverse test functions
   void reverse_itr(size_t size, size_t repeat)
   {  // size and vec.size() are equal
      size_t* data = vec.data();
      while( repeat-- )
      {  // reverse a vector that is not in order
         for(size_t i = 0; i < size; ++i)
            data[i] = i;
         std::reverse(vec.begin(), vec.end());
      }
   }
   void reverse_ptr(size_t size, size_t repeat)
   {  // size and vec.size() are equal
      size_t* data = vec.data();
      while( repeat-- )
      {  // reverse same vector as in reverse_itr
         for(size_t i = 0; i < size; ++i)
            data[i] = i;
         std::reverse(vec.data(), vec.data() + vec.size());
      }
   }
}
int main(void)
{  bool ok = true;
   using CppAD::time_test;
   using std::cout;
   //
   size_t test_size = 100000; // size of vector in test
   double time_min  = 1.0;    // minimum time in seconds for each test
   vec.resize(test_size);     // allocate memory outsize of test
   size_t repeat;             // output by time_test function
   // -----------------------------------------------------------------------
   // sort tests
   //
   // iterator
   double sort_itr_sec  = time_test(sort_itr, time_min, test_size, repeat);
   for(size_t i = 1; i < test_size; ++i)
      ok &= vec[i-1] <= vec[i];
   cout << "sort_itr_sec=" << sort_itr_sec << ", repeat=" << repeat << "\n";
   //
   // pointer
   double sort_ptr_sec  = time_test(sort_ptr, time_min, test_size, repeat);
   for(size_t i = 1; i < test_size; ++i)
      ok &= vec[i-1] <= vec[i];
   cout << "sort_ptr_sec=" << sort_ptr_sec << ", repeat=" << repeat << "\n";
   // -----------------------------------------------------------------------
   // reverse tests
   //
   // iterator
   double rev_itr_sec  = time_test(reverse_itr, time_min, test_size, repeat);
   for(size_t i = 1; i < test_size; ++i)
      ok &= vec[i] == test_size - 1 - i;
   cout << "rev_itr_sec=" << rev_itr_sec << ", repeat=" << repeat << "\n";
   //
   // pointer
   double rev_ptr_sec  = time_test(reverse_ptr, time_min, test_size, repeat);
   for(size_t i = 1; i < test_size; ++i)
      ok &= vec[i] == test_size - 1 - i;
   cout << "rev_ptr_sec=" << rev_ptr_sec << ", repeat=" << repeat;
   // -----------------------------------------------------------------------
   if( ok )
      return 0;
   return 1;
}
EOF
cxx_flags="-Wall -std=c++11 -Wshadow -Wconversion -O$opt_level"
if [ "$debug" == 'no' ]
then
   cxx_flags="$cxx_flags -DNDEBUG"
fi
echo "$compiler -I../../include $cxx_flags $name.cpp -o $name"
$compiler -I../../include $cxx_flags $name.cpp -o $name
#
echo "build/bug/$name"
if ! ./$name
then
   echo
   echo "build/bug/$name: Error"
   exit 1
fi
echo
# -----------------------------------------------------------------------------
echo "bug/$name.sh: OK"
exit 0