2016-05-11 9 views
0

私の仕事はテスト機能を書くことです。したがって、2つの異なる機能実装(同じタスクを行う)の実行時間を比較することができます。タスクは、ダッシュで区切られた文字列をラクダの表記法に変更することです。しかし、ここでは二次的です。JavaScript - 同じデータ構造を持つ異なる機能ランタイム処理 - どのように可能ですか?

私が最初に全体のテスト・セットアップを表示する必要がありますね:

// The array with the test-data. I have shorten it a lot. 
 
// The original-array, used for the test, is much larger. 
 
var test = ["Alpha-North-blue-teal-West-pink-crimson-Delta", 
 
\t \t "crimson-Gamma-blue-Delta", 
 
\t \t "white-cyan-South-blue-East-East-South-blue", 
 
\t \t "teal-black-East-East", 
 
\t \t "South-black", 
 
\t \t "black-cyan", 
 
\t \t "West-white-Beta-Gamma-red-North-Alpha-Beta", 
 
\t \t "Gamma-North-West-lime-North-crimson-North", 
 
\t \t "blue-red-orange", 
 
\t \t "red-West-South"]; 
 
\t 
 
// -- Implementation 1 ---------- 
 
function dashedToCamelCase(dashed) { 
 
    var ret; 
 
    var parts; 
 

 
    if (typeof dashed !== 'string' || !dashed) { 
 
    return ''; 
 
    } \t 
 

 
    parts = dashed.split('-'); 
 
    ret = parts[0].toLowerCase(); \t \t 
 
    parts = parts.slice(1); 
 

 
    ret = parts.reduce(function(previous, current) { 
 
    return previous + 
 
     current.slice(0, 1).toUpperCase() + 
 
     current.slice(1).toLowerCase(); 
 
    }, ret); 
 

 
    return ret; 
 
} 
 
\t 
 
// -- Implementation 2 ---------- 
 
function dashedToCamelCase2(dashed) { 
 
    if(typeof dashed != "string" || dashed.length==0) 
 
    return ""; 
 
    return dashed.toLowerCase().replace(/\-([a-z]?)/g, function(match, letter) { 
 
    return letter.toUpperCase(); 
 
    }); 
 
} 
 
    
 
function getRuntime(testData, func, countRunningTests) { 
 
    var i; 
 
    var tmp = 0; 
 
    var sum = 0; 
 
    var min = 0; 
 
    var max = 0; 
 
    var ret = {}; 
 

 
    var getRuntimeSingleTest = function() { 
 
    var start = Date.now(); 
 

 
    testData.forEach(function(item) { 
 
     func(item); 
 
    }); 
 

 
    return (Date.now() - start); 
 
    } 
 

 
    for (i = 1; i <= countRunningTests; i++) { 
 

 
    tmp = getRuntimeSingleTest(testData, func); 
 

 
    sum += tmp; 
 

 
    if (min === 0 || tmp < min) { 
 
     min = tmp; 
 
    } else if (tmp > max) { 
 
     max = tmp; 
 
    } 
 
    } 
 

 
    ret.averageRuntime = sum/countRunningTests; 
 
    ret.minimalRuntime = min; 
 
    ret.maximalRuntime = max; 
 

 
    return ret; 
 
} 
 
\t 
 
function displayResults(results, funcName) { 
 
    funcName = funcName || ''; 
 

 
    console.log('\n%s', funcName); 
 

 
    for (var i in results) { 
 
    console.log('%s : %s ms', i, results[i]); 
 
    } 
 
} 
 

 
displayResults(getRuntime(test, dashedToCamelCase, 100), ' - Implementation using reduce() - '); 
 
displayResults(getRuntime(test, dashedToCamelCase2, 100), ' - Implementation using replace() - ');

私は理解していないもの: 私は関数は、文字列全体アレイを何度も処理してみましょう。 最小ランタイムと最大ランタイムの結果は大きく異なります。多くの場合、最大ランタイムは、最小ランタイムよりも6倍または7倍高いことを意味します。

平均ランタイムも大きく異なります。しかし、複数回ではありません。

Test-run 1

Test-run 2

はどうということは可能ですか?

常に同じデータが使用されます。結果は少なくとも類似していなければなりません。インテルi5-3230M 2.60 GHzの

RAM:8ギガバイト

UPDATE

テストは11

CPUのWindows 7およびInternet Explorerでコンピューターにrunnedされています受け入れられた答えのように、私はテストランの数が増えました。

ここで私が言うことは、より多くのテストランが使用されるほど、より安定したものが平均ランタイムになるということです。

これは想定されているようです:最小および最大結果の変化は、CPU時間を必要とする他のプロセスの結果です。

+1

これはコンピュータで実行されている唯一のプロセスですか? – Arg0n

+0

@ArgOnいいえ。Outlook、Skype、セキュリティソフトウェアのような通常のものとバックグラウンドでの他の多くのものもあります。私は、リモートアクセス、ソフトウェアインストールの場合は...私はシステム管理者がこれらのマシン上で実行されているようなものをたくさん持っていると思います。 –

答えて

0

実行時間は、コンピュータの実行中のプロセスによって異なります。あなたのウイルス対策ソフトウェアが何かをやろうとしたら、あなたのブラウザプロセスは待たなければなりません。

平均を計算するために100000回同じ関数のようなこれらのテストをよりよく実行してください。

+0

これまでのヒントすべてありがとう。私はテストランの数を増やし、質問を更新します。 –

+0

@ st88このような小さな間隔では常に矛盾があることを常に忘れないでください。最終的には、あなたのハードウェアに浮かぶのは電気だけです。たくさんのランダムなものが起こります。 – Justinas

関連する問題