2010-09-12 17 views
21

मुझे कुछ आसानी से लागू करने योग्य एकल सीपीयू और मेमोरी गहन गणना की आवश्यकता है जिसे मैं जावा में एक टेस्ट थ्रेड शेड्यूलर के लिए लिख सकता हूं।सीपीयू गहन गणना उदाहरण?

उन्हें थोड़ा समय लेने वाला होना चाहिए, लेकिन अधिक महत्वपूर्ण संसाधन उपभोग करना चाहिए।

कोई विचार?

+0

@Martin: "42 + 0 =?": हर कोई पहले से ही जानता है कि 42 –

+0

@Martin है एक अच्छी शर्त की तरह लगता है :) meursault के सवाल spamming के लिए खेद है, मैं इसे प्रतिरोध करने के लिए बहुत मजेदार पाया। मैं अब रुक जाऊंगा और बेसमेंट में अपने लाख बंदरों और टाइपराइटर परियोजनाओं पर जांच करूँगा। –

उत्तर

21

CPU- सघन कार्यों में से कुछ आसान उदाहरण:

  • रूढ़ अंक के लिए खोज
  • जैसे बड़े factorials की गणना (BigInteger डिवीजनों के बहुत सारे शामिल है) 2000! ((बिगइंटर गुणों के बहुत सारे शामिल हैं)
  • कई Math.tan() गणना (यह दिलचस्प है क्योंकि Math.tan मूल है, इसलिए आप दो कॉल स्टैक का उपयोग कर रहे हैं: एक जावा कॉल के लिए, दूसरा सी कॉल के लिए।)
6

दो matrices गुणा करें। मैट्रिस डिस्क पर विशाल और संग्रहित होना चाहिए।

स्ट्रिंग खोज। या, सूचकांक एक विशाल दस्तावेज़ (प्रत्येक शब्द या वर्णमाला के तारों की घटना को पहचानें और गिनें) उदाहरण के लिए, आप एक बड़े सॉफ्टवेयर प्रोजेक्ट के स्रोत कोड में सभी पहचानकर्ताओं को इंडेक्स कर सकते हैं।

पीआई की गणना करें।

2 डी मैट्रिक्स, या एक छवि घुमाएं।

कुछ बड़ी फ़ाइलों को संपीड़ित करें।

...

+1

या बस एन सेकंड पर एक फॉलोअप में स्ट्रिंगबिल्डर को जोड़ दें। – tidwall

+0

इसमें बहुत सी आईओ भी शामिल होगा, इसलिए संसाधन खपत सीपीयू तीव्र – vikkyhacks

4

ठीक है यह जावा नहीं है, लेकिन इस Dhrystone बेंचमार्क एल्गोरिथ्म पर आधारित है here पाया। एल्गोरिदम के इन कार्यान्वयन से आपको यह पता चल सकता है कि यह कैसे किया जाता है। लिंक here में बेंचमार्क प्राप्त करने के लिए सी/सी ++ और असेंबलर के स्रोत शामिल हैं।

1
  1. Official RSA Challenge
  2. अनधिकृत आरएसए चैलेंज -।। ले लो कुछ सिफर है कि आप प्लेन में पढ़ने के लिए उस पर कंप्यूटर चलो यू एक यादृच्छिक एल्गोरिथ्म का उपयोग करते हैं चाहते हैं, तो एक छोटी लेकिन गैर शून्य मौका है कि आप सफल होंगे।
6

पीडीपी -11 के लिए सीपीयू सोख परीक्षण tan(atan(tan(atan(...))) आदि था। एफपीयू बहुत कठिन और ढेर और रजिस्टरों का काम करता है।

3
  • गणना फिबोनैकी श्रृंखला है, जहां n से अधिक 70. (समय लेने) बड़ी संख्या के

  • factorials की गणना है की n वें पद। (समय लेने वाला)

  • ग्राफ में दो नोड्स के बीच सभी संभव पथ खोजें। (स्मृति उपभोग)

+0

होने की तुलना में आईओ तीव्र होगी, मैंने जावा बिगइंटर के साथ प्रयास किया और फिबोनैकी श्रृंखला में 5000 वें नंबर की गणना भी बहुत जल्दी की गई। –

+0

@iamcreasy क्या आप ऐसा करने के लिए कुछ कामकाजी कोड पोस्ट कर सकते हैं (संभवतः विचार पर)? मैं उत्सुक हूं कि यह इतनी तेजी से कैसे हुआ। – Rushil

+0

निश्चित रूप से, [यहां] (http://pastebin.com/RaqQ9rwm)। अगर मैंने गलती की है तो मुझे बताएं। –

0

मैं जावा में थ्रेड प्राथमिकता के साथ गड़बड़ कर रहा था और नीचे दिए गए कोड का उपयोग किया था। ऐसा लगता है कि सीपीयू इतना व्यस्त है कि धागा प्राथमिकता एक फर्क पड़ता है।

@Test 
public void testCreateMultipleThreadsWithDifferentPriorities() throws Exception { 
    class MyRunnable implements Runnable { 
     @Override 
     public void run() { 
      for (int i=0; i<1_000_000; i++) { 
       double d = tan(atan(tan(atan(tan(atan(tan(atan(tan(atan(123456789.123456789)))))))))); 
       cbrt(d); 
      } 
      LOGGER.debug("I am {}, and I have finished", Thread.currentThread().getName()); 
     } 
    } 
    final int NUMBER_OF_THREADS = 32; 
    List<Thread> threadList = new ArrayList<Thread>(NUMBER_OF_THREADS); 
    for (int i=1; i<=NUMBER_OF_THREADS; i++) { 
     Thread t = new Thread(new MyRunnable()); 
     if (i == NUMBER_OF_THREADS) { 
      // Last thread gets MAX_PRIORITY 
      t.setPriority(Thread.MAX_PRIORITY); 
      t.setName("T-" + i + "-MAX_PRIORITY"); 
     } else { 
      // All other threads get MIN_PRIORITY 
      t.setPriority(Thread.MIN_PRIORITY); 
      t.setName("T-" + i); 
     } 
     threadList.add(t); 
    } 

    threadList.forEach(t->t.start()); 
    for (Thread t : threadList) { 
     t.join(); 
    } 
} 
संबंधित मुद्दे