20

C ++ / java / C#などの言語でビット演算子を使用する背後にある主なアイデアの1つは、それらが非常に高速であるということです。しかし、javascriptでは非常に遅いと聞きました(確かに、今日では数ミリ秒はそれほど重要ではありません)。なんでそうなの?

この質問では、ビット演算子を使用する場合について説明しているため、この質問の焦点をパフォーマンスに変更します。)

4

12 に答える 12

19

これはかなり古い質問ですが、更新されたバージョンに誰も答えていないようです。

C / C ++には存在しないJavaScriptで得られるパフォーマンスへの影響は、浮動小数点表現(JavaScriptがすべての数値を処理する方法)から32ビット整数へのキャストであり、ビット操作とその逆を実行します。

于 2012-06-22T15:18:10.080 に答える
15

誰ももう16進数を使用していませんか?

function hextoRgb(c) {
    c = '0x' + c.substring(1);
    return [(c >> 16) & 255, (c >> 8) & 255, c & 255]; 
}

var c1 = hextoRgb('#191970');
alert('rgb(' + c1.join(',') + ')');
于 2009-10-06T04:01:16.440 に答える
10

JSでビット単位のゼロシフトを使用して、整数の切り捨てをすばやく実行します。

var i=3.141532;
var iTrunc=i>>0; //3
于 2009-10-06T00:33:23.880 に答える
9

いつ使いたいですか?ビット単位の演算を実行する場合は、これらを使用することをお勧めします。ブール演算子を使用してブール演算を実行し、数学演算子を使用して数学演算を実行するのと同じです。

ビット演算子に慣れている場合は、一部のアプリケーションでそれらを使用するのが非常に自然です。これらは、過度に最適化されたブール配列以外の多くの目的に使用できます。もちろん、これらの状況はJavascriptプログラミングではあまり発生しませんが、それが演算子を使用できない理由ではありません。

于 2009-10-06T00:42:27.890 に答える
5

私はいくつかの良い情報を見つけました @http://dreaminginjavascript.wordpress.com/2009/02/09/bitwise-byte-foolish/

どうやら彼らは最近非常によく機能します。なぜあなたはそれらを使うのですか?他の場所と同じ理由。

于 2009-10-06T01:27:07.097 に答える
3

JavaScriptで書かれたNESエミュレーターがあります-それはビット単位の操作をたくさん利用しているようです。

于 2009-10-06T01:18:38.570 に答える
2

オペレーターを効率的または非効率的にするのは実装者次第だと思います。たとえば、JavaScript実装者がビット単位の演算を1つのマシン命令に変換するJITtingVMを作成することを妨げるものは何もありません。したがって、「JavaScriptのビット演算子」について本質的に遅いものは何もありません。

于 2009-10-06T01:05:06.967 に答える
2

javascriptでビット演算が特に遅いのではないかと思います。このような操作は、それ自体が非常に効率的なCPU操作に直接マップできるため、JavaScriptで修復できないほど遅くなるビット単位の操作に固有の特性はないようです。
2015年12月の編集:私は正直に立っています!ビット単位の演算に関してJavascriptが被るパフォーマンスへの影響は、floatからintへの変換とその逆の変換の必要性に起因します(Javascriptのすべての数値変数は浮動小数点値として格納されるため)。それを指摘してくれたChadSchougginsに感謝します。

それでもなお、いくつかの応答で示されているように、ビット単位の操作(例:暗号化とグラフィックス)に依存し、特に遅くないjavascriptのさまざまなアプリケーションが存在します...(このページのsilkyとSnarfblamを参照)。これは、ビット単位の演算を単一のネイティブCPU命令に直接変換するC / C ++や他の言語よりも低速ですが、ビット単位の演算はすべて非常に遅いことを示しています。

いくつかの特定の理由により、javascriptホストのさまざまな実装者がビット単位の演算を非常に遅くする方法で実装する可能性を楽しませてください。これが重要かどうかを確認してください...

javascriptは他の目的で使用されていますが、ユーザーインターフェイスタイプのサービスを提供する際のこの言語の最も一般的な使用法です
ところで、私はこれを蔑称的な意味ではまったく意味しません。これらのスマートUI機能を実行し、言語に課せられたさまざまな制約と標準への緩い順守を考慮すると、才能のあるjavascriptハッカーが必要であり続けています。重要なのは、UIタイプの要件のコンテキストでは、JavaScriptの処理の遅さを露呈する可能性のあるビット単位の操作
が必要になることは、せいぜいまれであるということです。したがって、一般的な用途では、プログラマーは、このアプローチがプログラム/データ全体でうまく流れるように見える場合はビット単位の演算を使用する必要があり、パフォーマンスの問題をほとんど気にせずに実行する必要があります。 ビット単位の使用に起因するパフォーマンスのボトルネックが発生する可能性が低い場合は、いつでもリファクタリングできますが、初期の最適化を避けた方がよいでしょう。

上記の注目すべき例外は、キャンバスの導入です。最近のブラウザでは、JavaScriptホストに、より原始的なグラフィック関数が必要になることが予想されます。このような操作では、場合によっては、大量のビット単位の操作が必要になる可能性があります(健全な場合もあります)。数学関数を行います)。これらのサービスは、最終的にはjavascriptライブラリを介してサポートされる可能性があります(最終的には言語の追加としてもサポートされます)。このようなライブラリの場合、業界の一般的な知識を利用して、最も効率的なアプローチを見つけ出すことができます。さらに、もし実際、ビット単位の演算ではjavascriptのパフォーマンスに弱点があります。さまざまなホスト(ブラウザー)でのjavascriptの実装がこの特定の領域を改善するために変更されると予測しているため、いくつかの助けが得られます。(これは、長年にわたって見られたjavascriptの典型的な進化パターンに従います。)

于 2009-10-06T01:11:32.900 に答える
1

Windows Scripting Host JScriptインカネーションでJavaScriptを使用すると、ビット単位の演算子を使用して、WMIまたはActiveDirectory呼び出しから返された値のフラグを選択する必要がある場合があります。たとえば、ADのユーザーレコードのユーザーアクセス値には、1つの長整数にパックされた複数のフラグが含まれています。

ADS_UF_ACCOUNTDISABLE = 0x00000002;

if (uac & ADS_UF_ACCOUNTDISABLE == ADS_UF_ACCOUNTDISABLE) {
  // user account has been disabled
}

または、誰かの任意のテーブル構造に、JScriptを使用してADOからアクセスできるそのようなフィールドが含まれている場合があります。

または、次の理由だけで、取得したデータを任意のプラットフォームでバイナリ表現に変換したい場合があります。

BinaryData = "L";
BinaryString = BinToStr(BinaryData, ".", "x");

// BinaryString => '.x..xx..'

したがって、JavaScriptでビット操作を実行する理由はたくさんあります。パフォーマンスに関しては、それを書いてテストするしかありません。ほとんどの場合、これらのシステムに含まれる他の多くの非効率性よりも大幅に悪くはなく、完全に許容できると思います。

于 2009-10-06T05:06:23.860 に答える
1

人々はJavaScriptで面白いことをします。

たとえば、(さまざまな理由で)多くの暗号化アルゴリズムが実装されています。もちろん、ビット演算子が使用されます。

于 2009-10-06T01:14:46.217 に答える
0

多くのビット演算がここでベンチマークされています:http://jsperf.com/rounding-numbers-down/3

ただし、jsPerfで独自のパフォーマンステストケースを自由に作成してください。

于 2010-08-07T13:06:27.797 に答える
0

速度が最優先の場合、ビットマスキングに使用できます:http ://snook.ca/archives/javascript/storing_values/

また、Netscape 4をサポートする必要がある場合は、それらを使用してDocument.captureEvents()を処理します。立派な会社ならNS4用のJSを書いてもらうわけではありません...

于 2009-10-06T01:05:09.713 に答える