Переглянути джерело

Adding a flag to control steps granularity in hope of better performance

main
Ludovic 'Archivist' Lagouardette 3 дні тому
джерело
коміт
c953888f2a
5 змінених файлів з 91 додано та 31 видалено
  1. +2
    -0
      CMakeLists.txt
  2. +43
    -29
      lib.c
  3. +8
    -2
      main.c
  4. +19
    -0
      test/test03.nk
  5. +19
    -0
      test/test06.nk

+ 2
- 0
CMakeLists.txt Переглянути файл

@ -20,6 +20,8 @@ add_library(ink lib.c include/ink.h)
# Removes several checks to improve performance in cases where ink is used as a bytecode
# add_definitions(-DNOEXTRACHECKS)
add_definitions(-DINK_STEP_BATCH_COUNT=5)
add_executable(ink_exe main.c)
target_link_libraries(ink_exe PUBLIC ink)
target_include_directories(ink PUBLIC include)

+ 43
- 29
lib.c Переглянути файл

@ -26,6 +26,14 @@
#define min(x, y) ((x) > (y) ? (y) : (x))
#define max(x, y) ((x) < (y) ? (y) : (x))
#ifdef __GNUC__
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
#else
#define likely(x) (!!(x))
#define unlikely(x) (!!(x))
#endif
struct label {
int active;
int dest;
@ -1071,35 +1079,41 @@ int ink_can_run(struct context* pContext) {
}
int ink_step_everyone(struct context* pContext) {
int out;
pContext->routine_current = -1;
for(;;) {
/* Increment to next runnable routine */
do{
++(pContext->routine_current);
} while(
pContext->routine_current < pContext->routines_top
&& pContext->routines[pContext->routine_current].panic != 0
&& pContext->routines[pContext->routine_current].parse_error.is_set
&& pContext->routines[pContext->routine_current].runtime_error.is_set
);
/* Exit condition */
if(pContext->routine_current >= pContext->routines_top) break;
/* Kill? */
if(pContext->routines[pContext->routine_current].panic == INK_ROUTINE_SUCCESS) {
ink_kill_routine(pContext, pContext->routine_current);
}
/* Step! */
out = ink_step(pContext);
if(out == 0) {
pContext->routines[pContext->routine_current].panic = INK_ROUTINE_SUCCESS;
} else if(out < 0) {
pContext->routines[pContext->routine_current].panic = out;
}
}
return 0;
int idx;
int out;
pContext->routine_current = -1;
for(;;) {
top_label:
/* Increment to next runnable routine */
do{
++(pContext->routine_current);
} while(
pContext->routine_current < pContext->routines_top
&& pContext->routines[pContext->routine_current].panic != 0
&& pContext->routines[pContext->routine_current].parse_error.is_set
&& pContext->routines[pContext->routine_current].runtime_error.is_set
);
/* Exit condition */
if(pContext->routine_current >= pContext->routines_top) break;
/* Kill? */
if(pContext->routines[pContext->routine_current].panic == INK_ROUTINE_SUCCESS) {
ink_kill_routine(pContext, pContext->routine_current);
}
/* Step! */
for(idx = 0; idx < INK_STEP_BATCH_COUNT; ++idx) {
out = ink_step(pContext);
if (unlikely(out == 0)) {
pContext->routines[pContext->routine_current].panic = INK_ROUTINE_SUCCESS;
goto top_label;
} else if (unlikely(out < 0)) {
pContext->routines[pContext->routine_current].panic = out;
goto top_label;
}
}
}
return 0;
}
int ink_new_type(

+ 8
- 2
main.c Переглянути файл

@ -4,8 +4,10 @@
int main(int argc, char** argv) {
char read_buffer[2048];
struct timespec start_time, end_time;
clock_t begin, end;
double time_spent;
double s_total = 0;
struct context* ctx;
char** end_argv;
ctx = ink_make_default_context();
@ -29,12 +31,16 @@ int main(int argc, char** argv) {
}
begin = clock();
clock_gettime(CLOCK_MONOTONIC, &start_time);
while(ink_can_run(ctx)) {
ink_step_everyone(ctx);
}
clock_gettime(CLOCK_MONOTONIC, &end_time);
ink_gc(ctx);
end = clock();
time_spent = ctx->steps/((double)(end - begin) / CLOCKS_PER_SEC);
printf("\nExecuted in %u steps\nCollected %u times\nExecution freq: %uHz\n", ctx->steps, ctx->collections, (unsigned int)time_spent);
time_spent = ctx->steps/(double)((end - begin) / CLOCKS_PER_SEC);
s_total += (end_time.tv_sec - start_time.tv_sec) + (end_time.tv_nsec - start_time.tv_nsec) / 1.0e9;
s_total = ctx->steps / s_total;
printf("\nExecuted in %u steps\nCollected %u times\nExecution freq: %lfHz\n", ctx->steps, ctx->collections, s_total);
return ctx->panic;
}

+ 19
- 0
test/test03.nk Переглянути файл

@ -0,0 +1,19 @@
fn work do
12 13 + 25 + 13 + 12 + 25 + 100 ==
12 13 + 25 + 13 + 12 + 25 + 100 == -
12 13 + 25 + 13 + 12 + 25 + 100 ==
12 13 + 25 + 13 + 12 + 25 + 100 == - +
12 13 + 25 + 13 + 12 + 25 + 100 ==
12 13 + 25 + 13 + 12 + 25 + 100 == -
12 13 + 25 + 13 + 12 + 25 + 100 ==
12 13 + 25 + 13 + 12 + 25 + 100 == - + +
12 13 + 25 + 13 + 12 + 25 + 100 ==
12 13 + 25 + 13 + 12 + 25 + 100 == -
12 13 + 25 + 13 + 12 + 25 + 100 ==
12 13 + 25 + 13 + 12 + 25 + 100 == - +
12 13 + 25 + 13 + 12 + 25 + 100 ==
12 13 + 25 + 13 + 12 + 25 + 100 == -
12 13 + 25 + 13 + 12 + 25 + 100 ==
12 13 + 25 + 13 + 12 + 25 + 100 == - + + + 0 ==
end

+ 19
- 0
test/test06.nk Переглянути файл

@ -3,3 +3,22 @@
[ 72 101 108 108 111 32 87 111 114 108 100 10 ]
stack.dump
# This prints the array above
work work work work work
work work work work work
work work work work work
work work work work work
work work work work work
work work work work work
work work work work work
work work work work work
work work work work work
work work work work work
work work work work work
work work work work work
work work work work work
work work work work work
work work work work work
work work work work work
work work work work work
work work work work work

Завантаження…
Відмінити
Зберегти