有一个分段函数,每段编译之后速度将近是原函数的十倍,然后打包成一个完整的分段函数(也编译的),速度只有原函数的一半了,折腾了半天只有这么点效果,好难过啊。
下面用一个类似的例子说明,每段编译后速度是原函数的5倍左右,打包后比原函数还慢了。
f1[x_] := Sin[x] + x^2 - 1/(1 + x);
f2[x_] := Sin[x] - x^2 - 1/(1 + x);
f3[x_] := Sin[x] - x^2 + 1/(1 + x);
cf1 = Compile[{{x, _Real}}, Sin[x] + x^2 - 1/(1 + x)];
cf2 = Compile[{{x, _Real}}, Sin[x] - x^2 - 1/(1 + x)];
cf3 = Compile[{{x, _Real}}, Sin[x] - x^2 + 1/(1 + x)];
Do[f1[0.01], {10^6}]; // AbsoluteTiming
Do[cf1[0.01], {10^6}]; // AbsoluteTiming
Do[f2[0.01], {10^6}]; // AbsoluteTiming
Do[cf2[0.01], {10^6}]; // AbsoluteTiming
Do[f3[0.01], {10^6}]; // AbsoluteTiming
Do[cf3[0.01], {10^6}]; // AbsoluteTiming
{2.554146, Null}
{0.448026, Null}
{2.836162, Null}
{0.462026, Null}
{2.487142, Null}
{0.440025, Null}
合并之后,
f[x_] := Which[x > 0, Sin[x] + x^2 - 1/(1 + x),
-1 < x <= 0, Sin[x] - x^2 - 1/(1 + x),
x <= -1, Sin[x] - x^2 + 1/(1 + x) ];
cf = Compile[{{x, _Real}}, Which[x > 0, Sin[x] + x^2 - 1/(1 + x),
-1 < x <= 0, Sin[x] - x^2 - 1/(1 + x),
x <= -1, Sin[x] - x^2 + 1/(1 + x) ]];
Do[f[0.01], {10^6}]; // AbsoluteTiming
Do[cf[0.01], {10^6}]; // AbsoluteTiming
{4.692268, Null}
{7.180411, Null}
难道是因为which吗,which也在可编译函数这中啊,这可怎么办啊。