2011-12-06 4 views
5

私は文字列から符号なし16ビット値を抽出するためにいくつかのコードを使用してきました。 FirefoxのでJavascript - String.prototypeに追加された関数のV8でパフォーマンスが悪いですか?

var UInt16 = function(s, n) { 
    return s.charCodeAt(n) + 256 * s.charCodeAt(n + 1); 
}; 

違い:

String.prototype.UInt16 = function(n) { 
    return this.charCodeAt(n) + 256 * this.charCodeAt(n + 1); 
}; 

だけパラメータとしてStringをとる機能を備えたよりもはるかに遅いです:

は私がStringのプロトタイプにこの機能を追加することを発見しました2の唯一の要因ですが、Chrome 15では百1回遅くなります!

http://jsperf.com/string-to-uint16

での結果は、誰もがこのために説明を差し出す、および/またはパフォーマンスヒットなしプロトタイプを使用して別の方法を提供することができますか?

+3

http://groups.google.com/group/nodejs/browse_thread/thread/45d6dc32250c0ad3は、いくつかの光を放つかもしれません。それはちょっと心配です。 –

+0

@CrescentFresh、私の答えを参照してください、それはまだ非常に遅く、オブジェクトを使用してスレッドで主張されている "1%以内" ...または多分私は間違っていますか? – Esailija

+0

@エサリジャ:質問に対するあなたの答えの関係はわかりません。テストケースへの追加は、単に(String型のオブジェクトへの参照を保存すると、同じメソッドをプリミティブで呼び出すよりも、そのオブジェクトでプロトタイプ付きのメソッドを呼び出すときの結果がより速くなることをGoogleグループの議論が示す)。 OPが対処しようとしている根本的な問題は、プリミティブをオブジェクトに繰り返しボクシングするときに暗黙の型強制と関係していることです。 –

答えて

1

(オブジェクトではないため)プリミティブからプロトタイプにアクセスするのは、オブジェクトからプロトタイプにアクセスするよりもはるかに時間がかかります。

http://jsperf.com/string-to-uint16/2

10倍速くクロムと2倍で速くFirefoxで私のために。

プロトタイプを使用する際に実際のボトルネックはありますか?毎秒数百万の操作を必要としないなら、まだ非常に高速です。必要な場合は、関数を使用してください。

0

オリオン座ゼータ星は、私は(私が誤って公表)迅速なjsperf testを作り、それがユーザーの種類にプロトタイプが遅くはないことを示しています。 V8のようなエンジンがどのように機能するかを考えてみると、組み込みオブジェクトにコードを追加するときにJavaコンパイルがはるかに異なった動作をすることは理にかなっています。

関連する問題