У меня есть несколько больших CArrays, возвращенных нативным сабвуфером, которые мне нужны для выполнения базовых элементарных математических операций.CArrays обычно порядка 10 ^ 6 элементов.Я обнаружил, что вызов .list для них относится к ним, как к обычным типам Perl6, очень дорого.Есть ли способ выполнять над ними элементарные операции, сохраняя их CArrays?
Краткий тестовый сценарий для проверки некоторых методов, которые я пробовал:
#!/usr/bin/env perl6
use v6.c;
use NativeCall;
use Terminal::Spinners;
my $list;
my $carray;
my $spinner = Spinner.new;
########## create data stuctures ##########
print "Creating 10e6 element List and CArray ";
my $create = Promise.start: {
$list = 42e0 xx 10e6;
$carray = CArray[num32].new($list);
}
$spinner.await: $create;
########## time List subtractions ##########
my $time = now;
print "Substracting two 10e6 element Lists w/ hyper ";
$spinner.await( Promise.start: {$list >>-<< $list} );
say "List hyper subtraction took: {now - $time} seconds";
$time = now;
print "Substracting two 10e6 element Lists w/ for loop ";
my $diff = Promise.start: {
for ^$list.elems {
$list[$_] - $list[$_];
}
}
$spinner.await: $diff;
say "List for loop subtraction took: {now - $time} seconds";
########## time CArray subtractions ##########
$time = now;
print "Substracting two 10e6 element CArrays w/ .list and hyper ";
$spinner.await( Promise.start: {$carray.list >>-<< $carray.list} );
say "CArray .list and hyper subtraction took: {now - $time} seconds";
$time = now;
print "Substracting two 10e6 element CArrays w/ for loop ";
$diff = Promise.start: {
for ^$carray.elems {
$carray[$_] - $carray[$_];
}
}
$spinner.await: $diff;
say "CArray for loop subtraction took: {now - $time} seconds";
Вывод:
Creating 10e6 element List and CArray |
Substracting two 10e6 element Lists w/ hyper -
List hyper subtraction took: 26.1877042 seconds
Substracting two 10e6 element Lists w/ for loop -
List for loop subtraction took: 20.6394032 seconds
Substracting two 10e6 element CArrays w/ .list and hyper /
CArray .list and hyper subtraction took: 164.4888844 seconds
Substracting two 10e6 element CArrays w/ for loop |
CArray for loop subtraction took: 133.00560218 seconds
Метод for loop кажется самым быстрым, но CArray по-прежнему занимал в 6 раз больше времени, чем List.
Есть идеи?