diff --git a/core/iwasm/common/wasm_native.c b/core/iwasm/common/wasm_native.c index fcf52de0..bbec4864 100644 --- a/core/iwasm/common/wasm_native.c +++ b/core/iwasm/common/wasm_native.c @@ -7,6 +7,12 @@ #include "wasm_runtime_common.h" #include "bh_log.h" +#define ENABLE_QUICKSORT 1 +#define ENABLE_SORT_DEBUG 0 + +#if ENABLE_SORT_DEBUG != 0 +#include +#endif static NativeSymbolsList g_native_symbols_list = NULL; static NativeSymbolsList g_native_symbols_list_end = NULL; @@ -103,6 +109,7 @@ check_symbol_signature(const WASMType *type, const char *signature) return true; } +#if ENABLE_QUICKSORT == 0 static void sort_symbol_ptr(NativeSymbol *native_symbols, uint32 n_native_symbols) { @@ -120,6 +127,56 @@ sort_symbol_ptr(NativeSymbol *native_symbols, uint32 n_native_symbols) } } } +#else +static void +swap_symbol(NativeSymbol* left, NativeSymbol* right) +{ + NativeSymbol temp = *left; + *left = *right; + *right = temp; +} + +static void +quick_sort_symbols(NativeSymbol* native_symbols, int left, int right) +{ + NativeSymbol base_symbol; + int pin_left = left; + int pin_right = right; + + if (left >= right) { + return; + } + + base_symbol = native_symbols[left]; + while (left < right) { + while (left < right + && strcmp(native_symbols[right].symbol, + base_symbol.symbol) > 0) { + right--; + } + + if (left < right) { + swap_symbol(&native_symbols[left], &native_symbols[right]); + left++; + } + + while (left < right + && strcmp(native_symbols[left].symbol, + base_symbol.symbol) < 0) { + left++; + } + + if (left < right) { + swap_symbol(&native_symbols[left], &native_symbols[right]); + right--; + } + } + native_symbols[left] = base_symbol; + + quick_sort_symbols(native_symbols, pin_left, left - 1); + quick_sort_symbols(native_symbols, left + 1, pin_right); +} +#endif /* end of ENABLE_QUICKSORT */ static void * lookup_symbol(NativeSymbol *native_symbols, uint32 n_native_symbols, @@ -205,6 +262,11 @@ register_natives(const char *module_name, bool call_conv_raw) { NativeSymbolsNode *node; +#if ENABLE_SORT_DEBUG != 0 + struct timeval start; + struct timeval end; + unsigned long timer; +#endif if (!(node = wasm_runtime_malloc(sizeof(NativeSymbolsNode)))) return false; @@ -223,7 +285,23 @@ register_natives(const char *module_name, g_native_symbols_list = g_native_symbols_list_end = node; } +#if ENABLE_SORT_DEBUG != 0 + gettimeofday(&start, NULL); +#endif + +#if ENABLE_QUICKSORT == 0 sort_symbol_ptr(native_symbols, n_native_symbols); +#else + quick_sort_symbols(native_symbols, 0, (int)(n_native_symbols - 1)); +#endif + +#if ENABLE_SORT_DEBUG != 0 + gettimeofday(&end, NULL); + timer = 1000000 * (end.tv_sec - start.tv_sec) + + (end.tv_usec - start.tv_usec); + LOG_ERROR("module_name: %s, nums: %d, sorted used: %ld us", + module_name, n_native_symbols, timer); +#endif return true; } @@ -321,4 +399,3 @@ wasm_native_destroy() g_native_symbols_list = g_native_symbols_list_end = NULL; } -