素数性能差异ACF vs. Lucee

Ale*_*lex 13 coldfusion performance lucee

以下用于查找素数的代码在Adobe ColdFusion(10)和Lucee(4.5)之间的性能差异很大.在同一台机器上测试(6C i7 3930k @ 4 GHz,Windows 10 64 Bit,两个CFML引擎上的JVM内存设置相同:JDK7 -Xms512m -Xmx2048m -XX:MaxPermSize=512m):

<cfscript>
    ticks = getTickCount();
    stopIndex   = 10000;
    primes      = [];
    divisions   = 0;
    primes.add(2);
    primes.add(3);
    n = 5;
    for (n; n < stopIndex; n += 2) {
        isPrime = true;
        d = 3;
        for (d; d < n; d++) {
            divisions++;
            if (n % d == 0) {
                isPrime = false;
                break;
            }
        }
        if (isPrime) {
            primes.add(n);
        }
    }
    ticks = (getTickCount() - ticks);
</cfscript>

<cfoutput>
    <p>
        #numberFormat(divisions)# divisions in #ticks# ms.
    </p>
    <p>
        #numberFormat(arrayLen(primes))# prime numbers found below #numberFormat(stopIndex)#.
    </p>
</cfoutput>
Run Code Online (Sandbox Code Playgroud)

stopIndex @ 10k

  • ACF:2​​80毫秒
  • LUC:1300毫秒

stopIndex @ 20k

  • ACF:1000毫秒
  • LUC:4800毫秒

stopIndex @ 30k

  • ACF:2​​200毫秒
  • LUC:10500毫秒

trycf.comcflive.net显示类似的差距.

我检查了cfscript(与标签)是否对时间有影响,但事实并非如此.与CFML引擎相关的服务器设置似乎也没有任何明显的影响.

可能是性能差异的原因是什么?
我怎么可能解决这个问题?

背景:我正在生产服务器上运行繁重的数学操作(几何,图像渲染),它恰好运行Lucee,并注意到性能低下.

Ada*_*ron 0

我认为性能问题应该由 Lucee 来解决,而不是由你和你的代码来解决。

然而,从该特定算法的整体性能的角度来看,您可以实现的最佳经济性是循环到sqr(n)+1而不是一直到n。您所做的工作比您需要的多得多,这对代码性能的影响比平台差异更大。

此外,您只需要循环前面的素数,而不是每个(第二个)数字。这会进一步提高你的表现。

我意识到该算法只是一个示例,但老实说,其余部分不太可能修复。向 Lucee 提出问题并等待修复(或者 DIY,如果您有时间/Java 知识)。