О пользе компиляции.
Имеем вот такую функцию:
Код:
g_f(N)={
my(v=vectorsmall(precprime(N-3)\2+1)); forprime(p=3,#v*2-1, v[#v-p\2]=1);
my(q=apply(x->(x+1)\2,vecextract(Vecrev(Pol(v)^2),[1..N\2])));
q[2]=1;
return(q);
}
Она возвращает массив из значений функции Гольдбаха. Обсуждалось вот тут
«Гипотеза о симметричных простых близнецах»Обнаружил что компиляция через gp2c этого кода --
ухудшает производительность!
Само оборачивание в функцию ухудшает, но это понятно (возвращаемый вектор объёмный).
Интерпретируемая функция для N=10^7 работает 4,8сек, а скомпилированная -- 6,5сек и ест больше стека.
Так что если уже наворотили максимальное избавление интрпретатора от for циклов, то компиляция может даже
ухудшить.
Теперь берём по логике такую же функцию:
Код:
g_f_D(N)={
my(v=vectorsmall(precprime(N-3)\2+1));
forprime(p=3,#v*2-1, v[#v-p\2]=1);
my(ff=Pol(v)^2);
my(q=vectorsmall(N\2,n, (polcoef(ff,n-1)+1)\2));
q[2]=1;
return(q);
}
Её отличие (автор
Dmitriy40 ) в том что для вектора результатов используется тип вектора t_VECSMALL
Для N=10^7 функция работает 5сек.
Компилируем, запускаем и получаем:
Код:
? g_f_D(10^7);
*** g_f_D: Warning: increasing stack size to 800000000.
*** g_f_D: Warning: increasing stack size to 1600000000.
*** at top-level: g_f_D(10^7)
*** ^-----------
*** g_f_D: overflow in t_INT-->long assignment.
?
Переполнился long! Неожиданно... Мы там возводим в квадрат многочлен из

членов, так что переполняться вроде и не должно. Но вот, надо иметь в виду.
Посмотрел, переполняется в строке my(q=vectorsmall(N\2,n, (polcoef(ff,n-1)+1)\2));