問題タブ [string-interning]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
2 に答える
893 参照

java - String.intern() は本当にパフォーマンスを向上させますか?

String.intern()メソッドがJavaでどのように実装されているかを調べるために、少し調査を行いました。

Open JDK 6 の Intern プールの C++ 実装を調べたところ、単純なHashSet. 私にとっては、誰かがインターンをしようとしているときにString、次のステップを実行する必要があることを意味しました。

  1. 指定されたハッシュコードを見つけるString
  2. 適切なバケットを見つける
  3. 指定された文字列をバケット内の他のすべての文字列と比較します。このステップの前に、バケット内に 0 個の文字列、1 個の文字列、または多数の文字列が存在する可能性があります。したがって、指定された文字列が以前にバケットに入れられている場合、少なくとも 1 つの比較が行われます (これが最良のケースです。もちろん、多くの衝突があった可能性があり、他の多くの文字列がバケットに含まれています)。
  4. String がバケットで見つかった場合は、intern()メソッドによって返される必要があります
  5. 文字列がバケットに見つからない場合は、バケットに入れ、intern()メソッドによって返す必要があります

str1.intern() == str2.intern()非常に多くの人が、それは よりも速いと言っていstr1.equals(str2)ます。

しかし、それが速くなる理由がわかりません。

ご覧のとおりstr1.equals(str2)、メソッドで char ごとに比較する 2 つの文字列が常に存在しますString.equals()

の場合str1.intern() == str2.intern()、プールとの間で文字列を取得または格納するために必要な比較の数は?

そのため、文字列を比較str1.intern() == str2.intern()するために使用する場合でも、==前述の比較など、多くの追加アクションがあります。

それを理解したとき、ベンチマークテストを行うことにしました。

最初の結果は、str1.intern() == str2.intern()が よりも速いことを示していましたstr1.equals(str2)

この動作は、String.intern()メソッドがネイティブであるため、毎回解釈されるべきではなくString.equals()、Java メソッドであることが原因でした。

そこで、-Xcompオプションを使用して、JVM が開始時にすべてのコードをコンパイルするようにすることにしました。

その後はインターン以上の速さを見せた。

Java 6 および 7 でテストしました。

私の質問は、文字列比較の高速化をインターンするときに状況を見たことがありますか? はい、どうしてですか?

それともintern()、より多くの空きメモリを節約するのに役立つのでしょうか?

0 投票する
0 に答える
31 参照

python - インターンロング

Python のintern関数を使用すると、同じ文字列のコピーが多数ある場合に、それらすべてを 1 つのオブジェクトへの参照に置き換えることで、メモリを節約できます。

同様の状況がありますが、文字列の代わりに s を扱っている点が異なりlongます。

sで同様のことを行う方法はありlongますか?

0 投票する
2 に答える
293 参照

java - コンパイル時または実行時にいつインターンが行われますか? コードでのそのような動作の理由は? BlueJの問題?

入力はこれは、入力するとtrueを返しますいつ入るかの値stringは 12 です。また、'string_input' ストアでは string、実行時に string_input がユーザーによって入力されている間に、コードで入力番号が宣言および初期化されます。

ケース1

「12」と入力すると true が返されます

ケース 2

「012」と入力すると、falseが返されます

なぜこれが起こるのですか?:/

0 投票する
1 に答える
1606 参照

c# - .NET はアセンブリごとに文字列インターン プールを作成しますか?

メモリに長期間保持される重複文字列が多数発生する状況があります。使用したいString.Internのですが、プロジェクトがライブラリであるため、潜在的なアプリケーション リソースに侵入したくありません。これはどのように作動しますか?