मेरे पास सूची में आइटम का एक गुच्छा है, और मुझे यह पता लगाने के लिए सामग्री का विश्लेषण करने की आवश्यकता है कि उनमें से कितने "पूर्ण" हैं। मैं विभाजन के साथ बाहर शुरू कर दिया है, लेकिन फिर एहसास हुआ कि मैं दो सूचियों वापस की जरूरत नहीं थी, इसलिए मैं एक गुना में स्विच:आवंटन और वर्र्स से बचते समय स्कैला में सूची को फोल्ड करने का कुशल तरीका
val counts = groupRows.foldLeft((0,0))((pair, row) =>
if(row.time == 0) (pair._1+1,pair._2)
else (pair._1, pair._2+1)
)
लेकिन मैं पंक्तियों का एक बहुत कुछ है समानांतर उपयोगकर्ताओं का एक बहुत के लिए के माध्यम से जाना , और यह बहुत सी जीसी गतिविधि (मेरे हिस्से पर धारणा पैदा कर रहा है ... जीसी अन्य चीजों से हो सकता है, लेकिन मुझे यह संदेह है क्योंकि मुझे लगता है कि यह हर आइटम को एक नया टुपल आवंटित करेगा)।
समय के लिएजा रहा है, मैं के रूप में
var complete = 0
var incomplete = 0
list.foreach(row => if(row.time != 0) complete += 1 else incomplete += 1)
जो जीसी ठीक करता है, लेकिन वार्स का परिचय इस फिर से लिख दिया।
मैं सोच रहा था कि क्या जीसी का दुरुपयोग नहीं करते हुए वर्र्स का उपयोग किए बिना ऐसा करने का कोई तरीका था?
संपादित करें:
जवाब मैं प्राप्त हो गया है पर मुश्किल कॉल। एक पूंछ-पुनरावर्ती अनुकूलित संस्करण की तुलना में बड़ी सूचियों (जैसे 40%) पर एक var कार्यान्वयन काफी तेजी से प्रतीत होता है जो अधिक कार्यात्मक है लेकिन समकक्ष होना चाहिए।
डीएचजी का पहला जवाब पूंछ-पुनरावर्ती व्यक्ति के प्रदर्शन के साथ-साथ लगता है, जिसका मतलब है कि आकार पास सुपर-कुशल है ... असल में, अनुकूलित होने पर यह पूंछ की तुलना में बहुत तेज गति से चलता है मेरे हार्डवेयर पर एक-एक है।
ऐसा लगता है कि आपके पास बहुत सारी चीज़ें हैं और अक्सर समाप्त/अधूरा लोगों की गणना करते हैं। क्या आप साथी ऑब्जेक्ट में दो काउंटर बनाए रख सकते हैं, जब किसी आइटम को सूची में जोड़ा जाता है (एक कन्स्ट्रक्टर में?) और समय के समय (समय के लिए सेटर में) समायोजित करना! = 0? – AmigoNico
मैं अन्य टिप्पणी से सहमत हूं। गुना सवाल एक लाल हेरिंग है। "मेरे पास बहुत सारे समानांतर उपयोगकर्ताओं के लिए जाने के लिए बहुत सारी पंक्तियां हैं" का अर्थ है कि आपके पास समांतर नौकरियां पूर्ण हैं और आप पूर्ण नौकरियों की गिनती चाहते हैं। या तो Future.onComplete पर एक गिनती टक्कर लें, या कुल मिलाकर उस पूर्ण पर ट्रिगर करें (यानी सभी के लिए प्रतीक्षा करें)। –