2009-03-27 8 views
7

मैं जावा में कुछ विशेष प्रयोजन डेटा संरचनाएं लिख रहा हूं, जिसका उद्देश्य ब्राउज़र में उपयोग के लिए है, (जीडब्ल्यूटी के साथ जावास्क्रिप्ट में संकलित)।जीडब्ल्यूटी: जेनरेटेड जावास्क्रिप्ट कोड में डायनामिक कैस्ट और कैनस्टयून्साफ को कॉल से कैसे बचें?

मैं कुछ अंतर्निहित जेडीके कक्षाओं के प्रदर्शन से मेल खाने की कोशिश कर रहा हूं, मैं चीजों को उचित रूप से तेज़ी से चला रहा हूं, लेकिन जब मैं अपने कोड ट्रेस को कुछ नकली जेडीके कोड में तुलना करता हूं, तो मेरे पास बहुत सी कॉल हैं गतिशील कैस्ट और कैनकनसेफ, जबकि जेडीके अनुकरण कक्षाएं नहीं करते हैं। और यह प्रदर्शन में अंतर के लिए भी खातों के बारे में है ...

कोई भी जीडब्ल्यूटी गुरु वहां से बचने के बारे में जानते हैं? यह :-(

विवरण एक 20% भूमि के ऊपर की राशि है:

:

यहां दो भिन्न डेटा संरचनाओं में प्रोफ़ाइल उत्पादन 0 और 100,000 के बीच यादृच्छिक पूर्णांक 10,000 सम्मिलन के लिए (Firebug में कब्जा), है java.util.TreeMap के लिए गूगल की ट्री-मैप कार्यान्वयन (एक लाल-काले वृक्ष):

Profile (4058.602ms, 687545 calls) 
Function    Calls  Percent Own Time 
$insert_1    129809  41.87% 1699.367ms 
$compare_0   120290  16%  649.209ms 
$isRed    231166  13.33%  540.838ms 
compareTo_0   120290  8.96%  363.531ms 
$put_2     10000  6.02%  244.493ms 
wrapArray    10000  3.46%  140.478ms 
createFromSeed   10000  2.91%  118.038ms 
$TreeMap$Node   10000  2.38%  96.706ms 
initDim    10000  1.92%  77.735ms 
initValues    10000  1.49%  60.319ms 
$rotateSingle   5990  0.73%  29.55ms 
TreeMap$Node   10000  0.47%  18.92ms 

मेरे कोड (एक AVL पेड़):

Profile (5397.686ms, 898603 calls) 
Function    Calls  Percent Own Time 
$insert    120899  25.06% 1352.827ms 
$compare    120899  17.94%  968.17ms 
dynamicCast   120899  14.12%  762.307ms <-------- 
$balanceTree   120418  13.64%  736.096ms 
$setHeight   126764  8.93%  482.018ms 
compareTo_0   120899  7.76%  418.716ms 
canCastUnsafe   120899  6.99%  377.518ms <-------- 
$put     10000  2.59%  139.936ms 
$AVLTreeMap$Node  9519  1.04%  56.403ms 
$moveLeft    2367  0.36%  19.602ms 
AVLTreeMap$State  9999  0.36%  19.429ms 
$moveRight    2378  0.34%  18.295ms 
AVLTreeMap$Node   9519  0.34%  18.252ms 
$swingRight    1605  0.26%  14.261ms 
$swingLeft    1539  0.26%  13.856ms 

अतिरिक्त टिप्पणियों:

  • एक और डेटा संरचना मैं बनाया (SkipList) के लिए एक ही समस्या है।
  • dynamicCast तुलना समारोह में लागू किया जा रहा है:

    सीएमपी = dynamicCast (right.key, 4) .compareTo $ (कुंजी);

  • कक्षा डायल लागू नहीं करती है, तो गतिशील कैस्ट चला जाता है (यानी: कक्षा से "मानचित्र लागू करता है"। इससे कोई फर्क नहीं पड़ता कि यह इंटरफ़ेस या सीधे के माध्यम से पहुंचा है। इसके परिणामस्वरूप एक ही पंक्ति संकलित होती है:

    सीएमपी = right.key.compareTo $ (कुंजी);

यह SkipList से जावा स्रोत के प्रासंगिक अनुभाग है:

private int compare(Node a, Object o) { 
    if (comparator != null) 
     return comparator.compare((K) a.key, (K) o); 

    return ((Comparable<K>) a.key).compareTo((K) o); 
} 

public V get(Object k) { 
    K key = (K) k; 
    Node<K, V> current = head; 

    for (int i = head.height - 1; i >= 0; i--) { 
     Node<K, V> right; 

     while ((right = current.right[i]) != null) { 
      int cmp = compare(right, key); 

      ... 
     } 
    } 
} 

उत्तर

4

दुर्भाग्य से मैं अभी भी कारण पर बिल्कुल स्पष्ट नहीं कर रहा हूँ, लेकिन मेरे अनुभव से, ऐसा लगता है, स्पष्ट डाले से लगता है:

((Comparable) obj).compareTo(other) 

जावास्क्रिप्ट उत्पन्न की तरह दिखता है:

dynamicCast(obj, 1).compareTo(other); 

कहाँ 1 एक उत्पन्न प्रकार आईडी है जो कास्ट के लक्ष्य का प्रतिनिधित्व करता है। गतिशील कैस्ट बदले में कॉल कर सकते हैं CastUnsafe और यदि झूठी है, तो यह क्लासकास्ट अपवाद फेंकता है। इसका मूल्य debated रहा है, क्योंकि यह पहले से होस्ट किए गए मोड में पकड़ा जाएगा।

यह JSNI साथ किनाराकशी कर ली जा सकती है:

public static native int compare(Object a, Object b) /*-{ 
    return [email protected]::compareTo(Ljava/lang/Object;)(b); 
}-*/; 
-1

वें करता है ई जावा 1.5 जेनेरिक और वाइल्डकार्ड का उपयोग इससे बच सकता है?

+0

वास्तव में मुझे लगता है कि यह चाहिए, लेकिन नहीं .. जो मैंने पाया है, उससे यह संकलक की कमी है। –

1

पता नहीं अगर आप GWT योगदानकर्ता के मंच में this thread देखा है ...

असल में, यह, एक ही समस्या आप की पहचान की है साथ शुरू होता है कुछ नए संकलक झंडे का प्रस्ताव, और कैसे उपयोग करने के लिए दिखाने के लिए पर चला जाता है कुछ जेएसएनआई को चारों ओर घूमने के लिए।

संपादित करें जीडब्ल्यूटी ट्रंक में एक नया कंपाइलर ध्वज है। the wiki देखें ...

+0

संयोग, मैंने कल उस धागे को पाया, और वास्तव में यह मेरा जेएसएनआई कामकाज था जो मैं कल के साथ आया था। –

1

GWT संस्करण 2.1 और बाद के लिए एक अद्यतन जवाब:

के बाद से GWT 2.1 (कम से कम है कि पहला उल्लेख है), GWT संकलक है -XdisableCastChecking नामक एक नया कंपाइलर तर्क जो कि सभी रनटाइम जांच को अक्षम करता है। नोट, यह विकल्प प्रयोगात्मक के रूप में चिह्नित किया गया है (संभवतः क्योंकि यह कक्षा कास्ट अपवादों को डीबग करने के लिए बहुत कठिन बना देगा)।

मेरे ऐप में dynamicCast को लघु प्रोफ़ाइल चलाने में हजारों बार बुलाया गया था, और फायरबग प्रोफाइलर में तीसरी सबसे अधिक समय लेने वाली विधि थी। इस कंपाइलर तर्क का उपयोग करके क्रोम स्पीड ट्रैसर में "लंबी अवधि घटनाक्रम" संदेशों की संख्या में काफी कमी आई है।

इस और अन्य कंपाइलर तर्कों के लिए GWT Compiler Options देखें।

0

यह निश्चित रूप से एक संकलक समस्या है: मैं निम्न पंक्ति पर समस्या है:

final DefaultIconedSuggestBox<SuggestValueProxy, IconedValueHolderItem<SuggestValueProxy>> fieldValueWidget = getCategoryWidget().getFieldValueWidget(); 

मैं वास्तव में नहीं जानता कि मैं इसे कैसे वैकल्पिक हल कर सकते हैं: इस लाइन एक पल मैं एक से बदल रहा हूँ में क्या होता है मॉड्यूल को दूसरे (यह शायद कोड स्प्लिटर समस्या से संबंधित है: भले ही मैं कोड स्प्लिट का उपयोग नहीं कर रहा हूं: मैं बस एक और मॉड्यूल के साथ एक और पेज लोड कर रहा हूं)

संबंधित मुद्दे