15

文字列として値を格納していますが、常に整数になることがわかっています。しかし、私はそれを数字として必要としているので、私はやっていn = n * 1た。次に、「うーん、おそらく使用する必要がありますparseInt()。次に、いくつかのjsperfテストを実行しましたが、Firefoxでの結果は興味深いものでした。

http://jsperf.com/parseintx1

全体的に見て、Firefoxを除いて、操作は非常に似ているように見えますが、使用*1は非常に高速です。何が起きてる?


編集

誰かが10進数のテストを行い、テスト全体を更新しました。これもクリックして、追加のフィードバックを提供してください:http: //jsperf.com/parseintx1/2

4

2 に答える 2

2

私は決して JavaScript エンジンの専門家ではありませんし、コンパイラの専門家でさえありませんが、結局のところ、コンパイラが次のように判断できるという事実に帰結すると確信しています。

var a = "123";
a = a * 1;

実際には次とまったく同じです:

var a = 123;

「a」はローカル変数であり、初期化の時点からその* 1式まで使用されないため、操作を実行するコードを生成する意味がまったくありません。その時点の後、コンパイラは、「a」が関数から「エスケープ」できる方法がないことを伝えることもできる場合があるため、実際には何もする意味がありませ。つまり、* 1テストの結果、得られるものと同等のものが得られる可能性があります。

function() {}

ただし、このparseInt()場合、再定義されている可能性があるため、コンパイラはparseInt()が本当にparseInt()であることを確認できません。したがって、関数呼び出しを行うコードを生成する必要があります。

于 2012-08-28T17:30:06.427 に答える
2

このバージョンは Firefox でも期待どおりの結果が得られるため、テスト用のセットアップである必要があります。私が思うに、あなたの設定では、parseIntすべての変数へのすべての反復で(まあ、少なくともFFでは)適用されますが、 からStringへの変換Numberは乗算テストの最初の反復に適用され、その後変数は数値になります乗算はもはや変換を必要としません。

バージョン 7 では、変数はテスト セットアップで割り当てられ、テストは反復ごとに新しい変数を割り当てます。現在、両方のテストに「等しい変化」がありparseInt、乗算テストよりも優れています。

IE[8,9] でテストを検査し、その結果が FF の結果のように見えることを確認した後、Chrome の結果について説明があると思います: テストの最初のバージョンでは、Chrome/Webkit がより適切に最適化されていると確信しています (特にそのparseInt部分)、より良い結果が得られparseIntます。これらのブラウザーで使用されるV8エンジンのコード (の一部) のプリコンパイルである可能性があります。

于 2012-08-28T17:30:18.760 に答える