2013-03-17 3 views
19

JavaScriptコードのthis performance reportが、さまざまなミニファイアと難読化ツールを使用して圧縮されていました。驚くべきことは、クロージャアドバンスモード以外は、ほとんどの場合、他のすべてのミニフェイザが、非圧縮コードよりも悪いコードを出力することです。私たちはそれをどのように説明しますか?縮小されたコードや難読化されたJavaScriptは、非圧縮コードより悪いパフォーマンスをするのはなぜですか?

pageの最後までスクロールしてレポートを表示してください。ここでのスクリーンショットは以下のとおりです。

enter image description here enter image description here enter image description here enter image description here

凡例:

  • ブルー - YUIコンプレッサー
  • レッド - 閉鎖(アドバンストモード)
  • オレンジ - 閉鎖(基本モード)
  • グリーン - JS分
  • パープル - JSパッカー
  • ライトブルー - UglifyJS
  • ピンク - 非圧縮コード
+0

[難読化されたコードを実行するとパフォーマンスが低下しますか?](http://stackoverflow.com/questions/2646216/is-there-a-performance-hit-when-running-obfuscated-code) – Barmar

+8

これは本当に重複した@Barmarではありません。はい、難読化についてですが、JavaScriptではなくJavaとC#について説明しています。 – nnnnnn

+0

難読化とパフォーマンスとを比較する必要があるのはなぜですか?誰かがコードを難読化する必要があると感じたら、パフォーマンスは問題にはならないと思います。 – Ozzy

答えて

7

最初に私は悪魔の主張者を演奏させてください。コードは実際には何も実行しません(JS Packerを除いては何も深刻ではありません)。基本的には、関数、オブジェクト、およびプロパティの定義です。

JS PackerはJavaScriptコードを生成せず、実行時にアンパックする必要がある圧縮テキストを生成します。だからそれはずっと遅いです。可能な限り、高度な最適化を使用するGoogle閉鎖によって識別子が置き換えられます。したがって、スクリプトを解析する際にはすでにパフォーマンス上の利点があります。

これは、コードサイズのパフォーマンスを犠牲にする可能性があると述べています。 1つの例は、truefalse!0!1に置き換えています。それはJavaScriptエンジンにも依存します。

新たな発見は、私はその間にいくつかのプロファイリングを行なったし、I気づい)

を、誰もが知っている...、いくつかのコールの後に、それの後に、最初の呼び出しの前にエンジンが決して最適化することはできませんでした一つのことを忘れた:ガベージコレクション。その影響は、スクリプトとブラウザ(異なるエンジン!)の違いのいくつかを説明するのに十分です。

これは、コードがあまり効果がなく、何かを持っているという事実と結びついています。 1つのテストでは、ガベージコレクションのCPU時間が非圧縮の場合約3%、JSMinの場合は9%でした。これは、ほぼ等しいコードでは全く異なる結果を意味します。

でも新しい発見

あなたが最初にJSMinを実行すると、それは、非圧縮よりも高速です。私はこれを数回試して、いつも同じ結果を得ました。これにより、以前の所見が確認されます。今私は解決策を見つけたと確信しています。

+2

+1は何もしないコードです。重要な唯一のベンチマークはあなたのものです。 –

+0

許可されていれば、コードは実際には何も実行しません。したがって、それは良いベンチマークの代表ではありません。それでも、この特定のテストでは、ミニコードが悪化*する理由は何ですか?特に、JSMinは[単に空白を省略します](http://www.crockford.com/javascript/jsmin.html)。だからなぜそれは悪化するのでしょうか? –

+0

JSMinのパフォーマンスが圧縮されていないバージョンと等しいという結果もあります。しかし、JSMinのパフォーマンスは私にとっても奇妙に思えます。それ以外は、3つの問題を考慮する必要があります。 1.解析:このスクリプトでは、ASTの構築に時間を費やします。 2。それはすべてJavaScriptエンジンに依存します。結果は大きく異なります。 3.フレームワーク自体、またはベンチマークを行う方法は、**この**のケースで**影響を与える可能性があります。私はそうは思わないが、私は確かに言うことができない。 – zeroflagL

-1

はい、難読化は、いくつかのパフォーマンス上の問題を引き起こす可能性がありますが、それは縮小さコードというのは本当ではありません圧縮されていないものより悪い実際、圧縮されていないコードよりも、圧縮されたコードの方が性能が優れています。これは、minfiedコードの変数/関数名がずっと短く、割り当てられたメモリ空間を参照する呼び出しをはるかに簡単にするためです。

-1

誤って難読化を混乱させてしまったようです。

2つの技術を理解するために、私はそれらを別々に説明します。

ミニフィニッシュは、ソースファイルのサイズが縮小され、より効率的なマシン可読性を目的としたフォーマットになります。これは、(a)コメントと不要な空白を削除し、(b)変数名を、1文字から始まるシンプルでインクリメンタルな変数名に置き換えることによって行われます。結果のコードは元のコードと同じように機能しますが、理論的にはブラウザが解析してコンパイルする方が高速です。

難読化は、コードが元のソースコードとして認識されなくなるように修正され、専有コードのリバースエンジニアリングを阻止するためによく使用される技術です。変更の中にはオーバーヘッドがあるものもあります。たとえば、コードを暗号化してから実行時に再度解読するなどです。つまり、コードobfuscatorは出力を小さくすることで仕事を終わらせるのが一般的です。

縮小化は、難読化の粗い形式であると考えられますが、通常、このようなプロセスは、パフォーマンスや帯域幅の目的でさらに実行されます。

関連する問題