Untitled
Anonymous
plain_text
08/27/2026 10:44 PM
2.5 KB
12
Indexable
#include <stdio.h>
#include <mach/mach_time.h>
#include <stdlib.h>
typedef struct timer_t timer_t;
struct timer_t {
uint64_t start_time;
mach_timebase_info_data_t timebase_info;
};
void timer_reset(timer_t *timer) {
timer->start_time = mach_absolute_time();
mach_timebase_info(&timer->timebase_info);
}
double timer_msec_elapsed(timer_t *timer) {
uint64_t end_time = mach_absolute_time();
uint64_t elapsed_time = end_time - timer->start_time;
double elapsed_msec = (double)elapsed_time * timer->timebase_info.numer / timer->timebase_info.denom / 1e6;
return elapsed_msec;
}
int counter = 0;
__attribute__((noinline))
int f(int i) {
counter += i;
return counter;
}
__attribute__((noinline))
int g(int i) {
counter += i*2;
return counter;
}
bool flag = false;
int main(int argc, char **argv) {
timer_t timer = {0};
// int n = 1000000000;
int n = 10000000;
int *a = malloc(sizeof(int) * n);
double msec_inner_if = 0.0;
double msec_outer_if = 0.0;
for (int j = 0; j < 100; ++j) {
flag = arc4random() % 2;
timer_reset(&timer);
for (int i = 0; i < n; ++i) {
if (flag) {
a[i] = f(i);
} else {
a[i] = g(i);
}
}
double msec_elapsed = timer_msec_elapsed(&timer);
msec_inner_if += msec_elapsed;
timer_reset(&timer);
if (flag) {
for (int i = 0; i < n; ++i)
a[i] = f(i);
} else {
for (int i = 0; i < n; ++i)
a[i] = g(i);
}
msec_elapsed = timer_msec_elapsed(&timer);
msec_outer_if += msec_elapsed;
if (j % 10 == 0) {
printf("Iteration: %d\n", j);
}
}
msec_inner_if /= 100.0;
msec_outer_if /= 100.0;
printf("Inner if msec: %.3f\n", msec_inner_if);
printf("Outer if msec: %.3f\n", msec_outer_if);
}Editor is loading...
Leave a Comment