Browse Source

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

main
Ludovic 'Archivist' Lagouardette 3 days ago
parent
commit
c953888f2a
5 changed files with 91 additions and 31 deletions
  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 View File

@ -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 # Removes several checks to improve performance in cases where ink is used as a bytecode
# add_definitions(-DNOEXTRACHECKS) # add_definitions(-DNOEXTRACHECKS)
add_definitions(-DINK_STEP_BATCH_COUNT=5)
add_executable(ink_exe main.c) add_executable(ink_exe main.c)
target_link_libraries(ink_exe PUBLIC ink) target_link_libraries(ink_exe PUBLIC ink)
target_include_directories(ink PUBLIC include) target_include_directories(ink PUBLIC include)

+ 43
- 29
lib.c View File

@ -26,6 +26,14 @@
#define min(x, y) ((x) > (y) ? (y) : (x)) #define min(x, y) ((x) > (y) ? (y) : (x))
#define max(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 { struct label {
int active; int active;
int dest; int dest;
@ -1071,35 +1079,41 @@ int ink_can_run(struct context* pContext) {
} }
int ink_step_everyone(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( int ink_new_type(

+ 8
- 2
main.c View File

@ -4,8 +4,10 @@
int main(int argc, char** argv) { int main(int argc, char** argv) {
char read_buffer[2048]; char read_buffer[2048];
struct timespec start_time, end_time;
clock_t begin, end; clock_t begin, end;
double time_spent; double time_spent;
double s_total = 0;
struct context* ctx; struct context* ctx;
char** end_argv; char** end_argv;
ctx = ink_make_default_context(); ctx = ink_make_default_context();
@ -29,12 +31,16 @@ int main(int argc, char** argv) {
} }
begin = clock(); begin = clock();
clock_gettime(CLOCK_MONOTONIC, &start_time);
while(ink_can_run(ctx)) { while(ink_can_run(ctx)) {
ink_step_everyone(ctx); ink_step_everyone(ctx);
} }
clock_gettime(CLOCK_MONOTONIC, &end_time);
ink_gc(ctx); ink_gc(ctx);
end = clock(); 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; return ctx->panic;
} }

+ 19
- 0
test/test03.nk View File

@ -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 View File

@ -3,3 +3,22 @@
[ 72 101 108 108 111 32 87 111 114 108 100 10 ] [ 72 101 108 108 111 32 87 111 114 108 100 10 ]
stack.dump stack.dump
# This prints the array above # 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

Loading…
Cancel
Save