49 const std::string sieve_of_eratosthenes_program =
50 " var sieve[10^8] := [false]; "
51 " var m := trunc(sqrt(sieve[])); "
56 " for (var i := 0; i <= m; i += 1) "
58 " assert(i < sieve[]); "
59 " if (false == sieve[i]) "
61 " for (var j := i^2; j < sieve[]; j += i) "
63 " assert(j < sieve[]); "
69 " var prime_count := sieve[] - sum(sieve); "
71 " prime_count == 5761455; ";
73 T nortc_result = T(0);
75 T assert_result = T(0);
77 T nortc_time_sec = T(0);
78 T rtc_time_sec = T(0);
79 T assert_time_sec = T(0);
82 expression_t expression;
85 parser.compile(sieve_of_eratosthenes_program,expression);
90 nortc_result = expression.value();
93 nortc_time_sec = timer.
time();
99 expression_t expression;
102 parser.register_vector_access_runtime_check(vec_rtc);
103 parser.compile(sieve_of_eratosthenes_program,expression);
108 rtc_result = expression.value();
111 rtc_time_sec = timer.
time();
116 expression_t expression;
119 parser.register_assert_check(asrt_handler);
120 parser.compile(sieve_of_eratosthenes_program,expression);
125 assert_result = expression.value();
128 assert_time_sec = timer.
time();
132 (nortc_result == T(1) ) &&
133 (nortc_result == rtc_result ) &&
134 (nortc_result == assert_result)
137 printf(
"Prime Sieve - NORTC time: %5.3fsec\tRTC time: %5.3fsec\tassert time: %5.3fsec\trtc_overhead: %5.3f%%\tassert_overhead: %5.3f%%\n",
141 std::max(0.0, 100.0 * ((rtc_time_sec - nortc_time_sec) / nortc_time_sec)),
142 std::max(0.0, 100.0 * ((assert_time_sec - nortc_time_sec) / nortc_time_sec)));
145 printf(
"ERROR - Results of NORTC and RTC runs do not match!\n");
155 const std::string bubble_sort_program =
156 " var upper_bound := v[]; "
159 " var new_upper_bound := 0; "
161 " for (var i := 1; i < upper_bound; i += 1) "
164 " if (v[i - 1] > v[i]) "
166 " v[i - 1] <=> v[i]; "
167 " new_upper_bound := i; "
171 " upper_bound := new_upper_bound; "
173 " until (upper_bound <= 1); "
175 " var result := true; "
177 " for (var i := 1; i < v[]; i += 1) "
180 " if (v[i - 1] > v[i]) "
188 T nortc_result = T(0);
190 T assert_result = T(0);
192 T nortc_time_sec = T(0);
193 T rtc_time_sec = T(0);
194 T assert_time_sec = T(0);
196 const std::size_t num_values = 10000;
197 std::vector<T> values(num_values, 0.0);
199 for (std::size_t i = 0; i < values.size(); ++i)
201 values[i] =
static_cast<double>(values.size() - i);
205 std::vector<T> v = values;
207 symbol_table_t symbol_table;
208 symbol_table.add_vector(
"v", v);
210 expression_t expression;
211 expression.register_symbol_table(symbol_table);
214 parser.compile(bubble_sort_program, expression);
219 nortc_result = expression.value();
222 nortc_time_sec = timer.
time();
226 std::vector<T> v = values;
228 symbol_table_t symbol_table;
229 symbol_table.add_vector(
"v", v);
233 expression_t expression;
234 expression.register_symbol_table(symbol_table);
237 parser.register_vector_access_runtime_check(vec_rtc);
238 parser.compile(bubble_sort_program, expression);
243 rtc_result = expression.value();
246 rtc_time_sec = timer.
time();
250 std::vector<T> v = values;
252 symbol_table_t symbol_table;
253 symbol_table.add_vector(
"v", v);
255 expression_t expression;
256 expression.register_symbol_table(symbol_table);
261 parser.register_assert_check(asrt_handler);
262 parser.compile(bubble_sort_program, expression);
267 assert_result = expression.value();
270 assert_time_sec = timer.
time();
274 (nortc_result == T(1) ) &&
275 (nortc_result == rtc_result ) &&
276 (nortc_result == assert_result)
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",
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)));
287 printf(
"ERROR - Results of NORTC and RTC runs do not match!\n");