0

私は何かを計算する3つの方法のどれが最も速いかを決定しようとしています。これを判断するために、私は単にそれぞれを呼び出すことを何度もループし、プロファイラーを調べてそれぞれにかかった時間を確認することを期待しています。

firefox +firebugとIE9開発者ツールの両方を使用してプロファイリングすると、妥当な結果が得られ、各関数に費やされた時間が示されます。ただし、Google Chromeでは、プロファイル結果に3つの機能すべてが表示されることはなく、さらに悪いことに、毎回異なる機能が表示されますが、3つすべてが表示されることはありません。プロファイラーを実行するたびに、見た目が異なる結果が得られ続けます。

プロファイラーが機能していると思いますが、使い方がわかりませんが、これは確かに壊れているようです。ドキュメントでこの動作を説明するものは何もありません。(私は通常のリリースを使用していましたが、開発者リリース(バージョン26.0.1410.10 dev-m)を試して、それがうまく機能するかどうかを確認しました-そうではありませんでした。ループの実行回数を増やしても、役に立たなかったようです)

Firebugの結果のサンプル(期待どおりに3つの関数+ runとonClickを表示): ここに画像の説明を入力してください

Chromeの結果#1のサンプル(3つのうち1つのみを表示): Chromeプロファイラーの結果#1

Chromeの結果#2のサンプル(3つのうち2つを表示): Chromeプロファイラーの結果#2

プロファイルされるコードは次のとおりです。

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <button onclick="run()">Run Test</button>
    <script type="text/javascript">
        var R = 6371,
            toRad = Math.PI / 180;

        function haversine1(lat1, lon1, lat2, lon2) {
            var dLat = (lat2 - lat1) * toRad,
                dLon = (lon2 - lon1) * toRad,
                a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
                    Math.cos(lat1 * toRad) * Math.cos(lat2 * toRad) *
                    Math.sin(dLon / 2) * Math.sin(dLon / 2),
                c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
            return (R * c);
        }

        function haversine2(lat1, lon1, lat2, lon2) {
            lat1 = lat1 * toRad;
            lon1 = lon1 * toRad;
            lat2 = lat2 * toRad;
            lon2 = lon2 * toRad;
            var dLat = lat2 - lat1,
                dLon = lon2 - lon1,
                a = Math.sin(dLat / 2) * Math.sin(dLat / 2) +
                    Math.cos(lat1) * Math.cos(lat2) *
                    Math.sin(dLon / 2) * Math.sin(dLon / 2),
                c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));
            return (R * c);
        }

        function lawOfCosines(lat1, lon1, lat2, lon2) {
            lat1 = lat1 * toRad;
            lon1 = lon1 * toRad;
            lat2 = lat2 * toRad;
            lon2 = lon2 * toRad;
            return Math.acos(Math.sin(lat1) * Math.sin(lat2) +
                                Math.cos(lat1) * Math.cos(lat2) *
                                Math.cos(lon2 - lon1)) * R;
        }

        function run() {
            console.log('Test start');
            var lat1 = 90,
                lat2 = -90,
                lon1 = 180,
                lon2 = -180,
                i = 0,
                x,
                y,
                z
            while (i++ < 1000000) {
                lat1 -= .01;
                lat2 += .01;
                lon1 -= .01;
                lon2 += .01;

                if (lat1 < -90) lat1 = 90;
                if (lat2 > 90) lat2 = -90;
                if (lon1 < -180) lon1 = 180;
                if (lon2 > 180) lon2 = -180;

                x = haversine1(lat1, lon1, lat2, lon2);
                y = haversine2(lat1, lon1, lat2, lon2);
                z = lawOfCosines(lat1, lon1, lat2, lon2);

                if (i % 1000 === 0) {
                    console.log('x: ' + x + ' y: ' + y + ' z: ' + z);
                }
            }
            console.log('Test end');
        }
    </script>
</body>
</html>
4

1 に答える 1

0

Chrome DevToolsは、統計CPUプロファイラーを使用します。JavaScript の呼び出しスタックを1秒間に1000回スキャンします。その結果、多くのスタックトレースを取得し、それらを組み合わせて呼び出しツリーにします。

長所:実行中のjavascriptコードのわずかな低下。

短所:0.5秒未満で実行されるjsコードに対して誤った結果が表示されます。

関数ごとに個別のサイクルを使用し、console.logを削除して、カウンター値を増やすことをお勧めします。また、v8は関数の本体をインライン化する可能性があり、プロファイラーがインライン化されたコードを個別にカウントできるかどうかはわかりません。

于 2013-02-22T19:18:37.203 に答える