配列を指定すると、次数2が5より大きいすべての要素を選択する必要があります。
青い角のオプションA:低レベルコード-古くて恐ろしい(部分的な最適化が可能)
for ( i = 0 , res = [ ] ; i < c ; i ++ ) { t = a [ i ] ; if ( t >= 2.236067 ) { continue ; } else { res. push ( t * t ) ; } }
for ( i = 0 , res = [ ] ; i < c ; i ++ ) { t = a [ i ] ; if ( t >= 2.236067 ) { continue ; } else { res. push ( t * t ) ; } }
for ( i = 0 , res = [ ] ; i < c ; i ++ ) { t = a [ i ] ; if ( t >= 2.236067 ) { continue ; } else { res. push ( t * t ) ; } }
for ( i = 0 , res = [ ] ; i < c ; i ++ ) { t = a [ i ] ; if ( t >= 2.236067 ) { continue ; } else { res. push ( t * t ) ; } }
for ( i = 0 , res = [ ] ; i < c ; i ++ ) { t = a [ i ] ; if ( t >= 2.236067 ) { continue ; } else { res. push ( t * t ) ; } }
for ( i = 0 , res = [ ] ; i < c ; i ++ ) { t = a [ i ] ; if ( t >= 2.236067 ) { continue ; } else { res. push ( t * t ) ; } }
for ( i = 0 , res = [ ] ; i < c ; i ++ ) { t = a [ i ] ; if ( t >= 2.236067 ) { continue ; } else { res. push ( t * t ) ; } }
for ( i = 0 , res = [ ] ; i < c ; i ++ ) { t = a [ i ] ; if ( t >= 2.236067 ) { continue ; } else { res. push ( t * t ) ; } }
赤いコーナーのオプションB:高レベルのコードは若くて美しい(部分的な最適化を受け入れられない)
- a。 map ( function ( t ) { return t * t } ) 。 filter ( 関数 ( t ) { return t > 5 } ) ;
戦闘は3つのアリーナで行われます。
1. AO args-関数アクティブ化オブジェクトのパラメーター。
2. AO-関数アクティベーションオブジェクトのローカル変数。
3.グローバル-グローバル変数。
武器庫には、すべての一般的なブラウザの最新の安定バージョンがあります。
すべてのテストコード:
- // * * * * * * * * * * * * * * * * * *
- // Activationオブジェクトの引数スコープ
- // * * * * * * * * * * * * * * * * * *
- ( 関数 ( a 、 dt 、 index 、 i 、 c 、 r 、 t 、 res ) {
- r = [ ] ;
- c = a。 長さ
- dt = 新しい日付( ) ;
- インデックス= 20000 ;
- while (インデックス- ) {
- a。 map ( function ( t ) { return t * t } ) 。 filter ( 関数 ( t ) { return t > 5 } ) ;
- }
- r [ 0 ] = ( 新しい日付( ) -dt ) ;
- dt = 新しい日付( ) ;
- インデックス= 20000 ;
- while (インデックス- ) {
- for ( i = 0 、 res = [ ] ; i < c ; i ++ ) {
- t = a [ i ] ;
- if ( t > = 2.236067 ) {
- 続ける ;
- } else {
- 解像度 プッシュ ( t * t ) ;
- }
- }
- }
- r [ 1 ] = ( 新しい日付( ) -dt ) ;
- alert ( 'ao args:' + r ) ;
- } ( [ 1、2、3、4、5、6、7、8、9、10、1、2、3、4、5、6、7、8、9、10、1、2、3、4 5、6、7、8、9、10、1、2、3、4、5、6、7、8、9、10、1、2、3、4、5、6、7、8、9 、 10 ] )) ) ;
- // * * * * * * * * * * * * * * * * * *
- //アクティベーションオブジェクトのスコープ
- // * * * * * * * * * * * * * * * * * *
- ( 関数 ( ) {
- var a = [ 1、2、3、4、5、6、7、8、9、10、1、2、3、4、5、6、7、8、9、10、1、2、3 、 4、5、6、7、8、9、10、1、2、3、4、5、6、7、8、9、10、1、2、3、4、5、6、7、8 、 9、10 ] 、
- dt
- インデックス、
- 私は
- c
- r
- t
- 解像度
- ;
- r = [ ] ;
- c = a。 長さ
- dt = 新しい日付( ) ;
- インデックス= 20000 ;
- while (インデックス- ) {
- a。 map ( function ( t ) { return t * t } ) 。 filter ( 関数 ( t ) { return t > 5 } ) ;
- }
- r [ 0 ] = ( 新しい日付( ) -dt ) ;
- dt = 新しい日付( ) ;
- インデックス= 20000 ;
- while (インデックス- ) {
- for ( i = 0 、 res = [ ] ; i < c ; i ++ ) {
- t = a [ i ] ;
- if ( t > = 2.236067 ) {
- 続ける ;
- } else {
- 解像度 プッシュ ( t * t ) ;
- }
- }
- }
- r [ 1 ] = ( 新しい日付( ) -dt ) ;
- alert ( 'ao:' + r ) ;
- } ( ) ) ;
- // * * * * * * * * * * * * * * * * * *
- //グローバルスコープ
- // * * * * * * * * * * * * * * * * * *
- var a = [ 1、2、3、4、5、6、7、8、9、10、1、2、3、4、5、6、7、8、9、10、1、2、3 、 4、5、6、7、8、9、10、1、2、3、4、5、6、7、8、9、10、1、2、3、4、5、6、7、8 、 9、10 ] 、
- dt
- インデックス、
- 私は
- c
- r
- t
- 解像度
- ;
- r = [ ] ;
- c = a。 長さ
- dt = 新しい日付( ) ;
- インデックス= 20000 ;
- while (インデックス- ) {
- a。 map ( function ( t ) { return t * t } ) 。 filter ( 関数 ( t ) { return t > 5 } ) ;
- }
- r [ 0 ] = ( 新しい日付( ) -dt ) ;
- dt = 新しい日付( ) ;
- インデックス= 20000 ;
- while (インデックス- ) {
- for ( i = 0 、 res = [ ] ; i < c ; i ++ ) {
- t = a [ i ] ;
- if ( t > = 2.236067 ) {
- 続ける ;
- } else {
- 解像度 プッシュ ( t * t ) ;
- }
- }
- }
- r [ 1 ] = ( 新しい日付( ) -dt ) ;
- alert ( 'global:' + r ) ;
コード: pastebin.com/mqBdkXZG
結果
Ff | 高レベル | 低レベル |
AO args | 458 | 92 |
あお | 474 | 122 |
グローバル | 479 | 162 |
オペラ | 高レベル | 低レベル |
AO args | 416 | 22 |
あお | 427 | 21 |
グローバル | 428 | 49 |
クロム | 高レベル | 低レベル |
AO args | 83 | 9 |
あお | 89 | 8 |
グローバル | 98 | 28 |
さ | 高レベル | 低レベル |
AO args | 153 | 21 |
あお | 146 | 24 |
グローバル | 147 | 25 |
IE8 | 高レベル | 低レベル |
AO args | 脱落した | 441 |
あお | 脱落した | 393 |
グローバル | 脱落した | 822 |
まとめ
ご覧のとおり、トレンドはAO args | AOがGlobalよりも速いです。 これはECMAScript仕様から明らかです。アクティベーションオブジェクトの変数へのアクセスは、グローバルオブジェクトよりも「コードに近い」ため(AO)高速です。
ECMAScriptにはRubyのようなブロックがないため、配列の各要素に対して関数が呼び出され、関数の呼び出しはJSにとって高価な操作であるため、低レベルコードは高レベルコードよりも何倍も高速です。 高レベルのコードは最大20倍遅くなります!
ChromeはJITコンパイルを備えているため非常に高速ですが、頻繁に使用されるコードブロックについては(1回の実行で同じ結果が得られます)。
興味深い点は、Firefoxを示しています。AOargs(低)92; AO(低)122; AOは4分の1の速さで議論します。 これらの変数はすべてAO引数ですが、AOは同じオブジェクト内にありますが、AF AO引数では、結果から判断して、別のオブジェクトとして割り当てられます。
別の興味深いテスト。
- ( function ( r 、 dt 、 index 、 i 、 j ) {
- dt = 新しい日付( ) ;
- インデックス= 50000 ;
- while (インデックス- ) {
- //ブロックA
- for ( i = 0 、 j = 0 ; i < 20 ; i ++ ) {
- j ++;
- }
- // -------
- }
- r [ 0 ] = 新しい日付-dt ;
- dt = 新しい日付( ) ;
- インデックス= 50000 ;
- while (インデックス- ) {
- //ブロックB
- j は 0 です。
- j ++; j ++; j ++; j ++; j ++;
- j ++; j ++; j ++; j ++; j ++;
- j ++; j ++; j ++; j ++; j ++;
- j ++; j ++; j ++; j ++; j ++;
- // -------
- }
- r [ 1 ] = 新しい日付-dt ;
- アラート ( r ) ;
- } ( [ ] ) ) ;
どのブロックが高速になりますか? 回答: pastebin.com/hXxQb6pk
UPD最終的には、すべてがインターフェイスの再描画(リフロー、リドロー)に依存しますが、私の実践が示しているように、リフローの最適化は十分ではありませんでした。 匿名関数の呼び出しによってかなりの部分が消費され、それらが削除され、特に古代のブラウザではかなりの増加が得られました。 この記事を行動の手引きとして受け取らないでください。あなたにとって便利だと思うコードを書いてください。 必要に応じて最適化することをお勧めします。