13

素数を見つける次のコードは、Adobe ColdFusion (10) と Lucee (4.5) でパフォーマンスが大きく異なります。同じマシンでテスト済み (6C i7 3930k @ 4 GHz、Windows 10 64 ビット、両方の 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>

stopIndex @ 10k

  • ACF: 280 ミリ秒
  • ルク: 1300 ミリ秒

stopIndex @ 20k

  • ACF: 1000 ミリ秒
  • ルク: 4800 ミリ秒

stopIndex @ 30k

  • ACF: 2200 ミリ秒
  • ルク: 10500 ミリ秒

trycf.comcflive.net同様のギャップを示します。

cfscript (対タグ) が時間に影響を与えるかどうかを確認しましたが、影響はありません。CFML エンジン関連のサーバー設定も、顕著な影響を与えていないようです。

パフォーマンスの違いの理由は何でしょうか?
そして、どうすればこれを解決できますか?

背景: 実稼働サーバーで重い数学演算 (ジオメトリ、画像レンダリング) を実行していますが、たまたま Lucee が実行されていて、パフォーマンスが遅いことに気付きました。

4

3 に答える 3

0

パフォーマンスの問題の側面は、あなたとあなたのコードではなく、修正するLuceeにかかっていると思います。

ただし、この特定のアルゴリズムの全体的なパフォーマンスの観点からすると、最も節約できるのは、 までsqr(n)+1ずっとループするのではなく、までループすることnです。必要以上に多くの作業を行っています。これは、プラットフォームの違いよりも、このコードのパフォーマンスに大きく貢献しています。

また、すべての(2番目の)数ではなく、前の素数をループするだけで済みます。それはあなたのパフォーマンスをさらに向上させるでしょう。

アルゴリズムが単なる例であることは理解していますが、正直なところ、残りの部分はあなたが修正できる可能性が高いものではありません. Lucee にチケットを提出し、修正されるのを待ちます (または、時間があれば / Java の知識がある場合は DIY を行います)。

于 2016-05-09T22:09:33.870 に答える