問題タブ [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.
java - String.intern() は本当にパフォーマンスを向上させますか?
String.intern()
メソッドがJavaでどのように実装されているかを調べるために、少し調査を行いました。
Open JDK 6 の Intern プールの C++ 実装を調べたところ、単純なHashSet
. 私にとっては、誰かがインターンをしようとしているときにString
、次のステップを実行する必要があることを意味しました。
- 指定されたハッシュコードを見つける
String
- 適切なバケットを見つける
- 指定された文字列をバケット内の他のすべての文字列と比較します。このステップの前に、バケット内に 0 個の文字列、1 個の文字列、または多数の文字列が存在する可能性があります。したがって、指定された文字列が以前にバケットに入れられている場合、少なくとも 1 つの比較が行われます (これが最良のケースです。もちろん、多くの衝突があった可能性があり、他の多くの文字列がバケットに含まれています)。
- String がバケットで見つかった場合は、
intern()
メソッドによって返される必要があります - 文字列がバケットに見つからない場合は、バケットに入れ、
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()
、より多くの空きメモリを節約するのに役立つのでしょうか?
python - インターンロング
Python のintern
関数を使用すると、同じ文字列のコピーが多数ある場合に、それらすべてを 1 つのオブジェクトへの参照に置き換えることで、メモリを節約できます。
同様の状況がありますが、文字列の代わりに s を扱っている点が異なりlong
ます。
sで同様のことを行う方法はありlong
ますか?
java - コンパイル時または実行時にいつインターンが行われますか? コードでのそのような動作の理由は? BlueJの問題?
の値
string
は 12 です。また、'string_input' ストアでは
string
、実行時に string_input がユーザーによって入力されている間に、コードで入力番号が宣言および初期化されます。
ケース1
「12」と入力すると true が返されます
ケース 2
「012」と入力すると、falseが返されます
なぜこれが起こるのですか?:/
c# - .NET はアセンブリごとに文字列インターン プールを作成しますか?
メモリに長期間保持される重複文字列が多数発生する状況があります。使用したいString.Intern
のですが、プロジェクトがライブラリであるため、潜在的なアプリケーション リソースに侵入したくありません。これはどのように作動しますか?