我有一些简单的awk数组函数,它们在阵列大小达到约500万时表现良好,大约有700万次性能下降。我想知道原因是什么以及如何解决它的任何建议。
function rand_init(l_rseed) {
"date +%N"|getline l_rseed;
srand(l_rseed);
close("date +%N");
PROCINFO["sorted_in"]="@ind_num_asc";
}
function get_rand(max) { return int(rand()*max); }
function rm_element(l_ind) {
g_my_arr[l_ind]=g_my_arr[g_my_arr_sz--];
}
function get_rand_element(l_ridx,l_ret) {
l_ridx=get_rand(g_my_arr_sz);
l_ret=g_my_arr[l_ridx];
rm_element(l_ridx);
return l_ret;
}
BEGIN {
rand_init();
g_start_size=7000001; ## 50000001 is quick
for(i=1;i<g_start_size;i++) {
g_my_arr[i]=(i)
}
g_my_arr_sz=length(g_my_arr);
print "size of array is "(g_my_arr_sz);
print "getting a few random elements ..."
## Randomly remove all except last 10 elements.
for (i=1;i<(g_start_size-10);i++) get_rand_element();
for (i=1;i<=g_my_arr_sz;i++) print "New Array, Index("(i)"): "(g_my_arr[i]);
print "Size of the array is now: "(g_my_arr_sz)
}
从g_start_size = 5000001开始,情况相当顺利。
size of array is 5000000
getting a few random elements ...
New Array, Index(1): 4306493
New Array, Index(2): 316250
New Array, Index(3): 1305392
New Array, Index(4): 602315
New Array, Index(5): 1204246
New Array, Index(6): 4535772
New Array, Index(7): 3865333
New Array, Index(8): 4837828
New Array, Index(9): 88774
New Array, Index(10): 1718274
Size of the array is now: 10
real 0m22.098s
user 0m21.116s
sys 0m0.758s
向上移动到g_start_size = 7000001,事情变得缓慢。
size of array is 7000000
getting a few random elements ...
New Array, Index(1): 894985
New Array, Index(2): 3431108
New Array, Index(3): 240856
New Array, Index(4): 6897693
New Array, Index(5): 3735959
New Array, Index(6): 934555
New Array, Index(7): 1472357
New Array, Index(8): 3793277
New Array, Index(9): 3326249
New Array, Index(10): 6639585
Size of the array is now: 10
real 4m24.952s
user 0m47.130s
sys 1m20.942s
答案 0 :(得分:0)
(1)awk具有关联数组,而不是基于整数的数组。您可能需要考虑使用支持基于整数的数组的解释语言。例如,由于ruby具有类似awk的模式,您可能需要考虑这一点。
(2)如果“ary”是一个数组,那么你可以使用“delete ary”对内存使用情况进行一些控制。
(3)在我的Mac上,使用gawk,你的程序在时间上与g_start_size大致成比例(例如5e6为11s,7e6为17s)。
(4)mawk略快(例如7e6为15s)。