1

GWTによって生成されたjavascriptコードは、HashMap.iterator()非常HashSet.iterator()に低速です。それをスピードアップする方法はありますか?

4

1 に答える 1

3

非常に遅いですか?もう少し具体的にする必要があります。100000 個の数値を合計する小さな例を次に示します。

final int N = 100000;

final long startInsert = System.currentTimeMillis();

final HashSet<Integer> set = new HashSet<Integer>(N);
for (int i = 0; i < N; i ++)
  set.add(i);
final long stopInsert = System.currentTimeMillis();

RootPanel.get().add(new Label(
    "Time to insert: " + (stopInsert - startInsert) + "ms"));

final long startIterate = System.currentTimeMillis();
final Iterator<Integer> iterator = set.iterator();

int sum = 0;
while (iterator.hasNext()) {
  final Integer integer = iterator.next();
  sum += integer;
}

final long stopIterate = System.currentTimeMillis();
RootPanel.get().add(new Label("Sum: " + sum + 
    ", Time to iterate: " + (stopIterate - startIterate) + "ms"));

Core2 Duo でこれを試してみましょう:

Firefox 15 (コンパイルモード) での出力は次のとおりです。

Time to insert: 490ms
Sum: 4999950000, Time to iterate: 766ms 

そしてChrome 21(コンパイルモード):

Time to insert: 130ms
Sum: 4999950000, Time to iterate: 105ms

それは開発モードよりも遅いです:

Firefox 15 (開発モード):

Time to insert: 16ms
Sum: 704982704, Time to iterate: 12ms

Chrome 21 (開発モード):

Time to insert: 59ms
Sum: 704982704, Time to iterate: 10ms

しかし、これが JavaScript 対 Java であることを考えると、結果は実際にはかなり良いものです。

(ところで、JavaScript (4999950000) と比較して Java (704982704) で合計が異なる理由を誰かが疑問に思う場合に備えて...これは予想されることです。 https://developers.google.com/web-toolkit/doc/latest/DevGuideCodingBasicsCompatibilityを参照してください#言語)

于 2012-09-05T13:34:30.250 に答える