150{
154
155 const std::string bubble_sort_program =
156 " var upper_bound := v[]; "
157 " "
158 " repeat "
159 " var new_upper_bound := 0; "
160 " "
161 " for (var i := 1; i < upper_bound; i += 1) "
162 " { "
163 " assert(i < v[]); "
164 " if (v[i - 1] > v[i]) "
165 " { "
166 " v[i - 1] <=> v[i]; "
167 " new_upper_bound := i; "
168 " }; "
169 " }; "
170 " "
171 " upper_bound := new_upper_bound; "
172 " "
173 " until (upper_bound <= 1); "
174 " "
175 " var result := true; "
176 " "
177 " for (var i := 1; i < v[]; i += 1) "
178 " { "
179 " assert(i < v[]); "
180 " if (v[i - 1] > v[i]) "
181 " { "
182 " result := false; "
183 " }; "
184 " }; "
185 " "
186 " result; ";
187
188 T nortc_result = T(0);
189 T rtc_result = T(0);
190 T assert_result = T(0);
191
192 T nortc_time_sec = T(0);
193 T rtc_time_sec = T(0);
194 T assert_time_sec = T(0);
195
196 const std::size_t num_values = 10000;
197 std::vector<T> values(num_values, 0.0);
198
199 for (std::size_t i = 0; i < values.size(); ++i)
200 {
201 values[i] = static_cast<double>(values.size() - i);
202 }
203
204 {
205 std::vector<T> v = values;
206
207 symbol_table_t symbol_table;
208 symbol_table.add_vector("v", v);
209
210 expression_t expression;
211 expression.register_symbol_table(symbol_table);
212
213 parser_t parser;
214 parser.compile(bubble_sort_program, expression);
215
218
219 nortc_result = expression.value();
220
222 nortc_time_sec = timer.
time();
223 }
224
225 {
226 std::vector<T> v = values;
227
228 symbol_table_t symbol_table;
229 symbol_table.add_vector("v", v);
230
232
233 expression_t expression;
234 expression.register_symbol_table(symbol_table);
235
236 parser_t parser;
237 parser.register_vector_access_runtime_check(vec_rtc);
238 parser.compile(bubble_sort_program, expression);
239
242
243 rtc_result = expression.value();
244
246 rtc_time_sec = timer.
time();
247 }
248
249 {
250 std::vector<T> v = values;
251
252 symbol_table_t symbol_table;
253 symbol_table.add_vector("v", v);
254
255 expression_t expression;
256 expression.register_symbol_table(symbol_table);
257
259
260 parser_t parser;
261 parser.register_assert_check(asrt_handler);
262 parser.compile(bubble_sort_program, expression);
263
266
267 assert_result = expression.value();
268
270 assert_time_sec = timer.
time();
271 }
272
273 if (
274 (nortc_result == T(1) ) &&
275 (nortc_result == rtc_result ) &&
276 (nortc_result == assert_result)
277 )
278 {
279 printf("Bubble Sort - NORTC time: %5.3fsec\tRTC time: %5.3fsec\tassert time: %5.3fsec\trtc_overhead: %5.3f%%\tassert_overhead: %5.3f%%\n",
280 nortc_time_sec,
281 rtc_time_sec,
282 assert_time_sec,
283 std::max(0.0, 100.0 * ((rtc_time_sec - nortc_time_sec) / nortc_time_sec)),
284 std::max(0.0, 100.0 * ((assert_time_sec - nortc_time_sec) / nortc_time_sec)));
285 }
286 else
287 printf("ERROR - Results of NORTC and RTC runs do not match!\n");
288}