2016-03-24 16 views
0

Projenin eşzamanlı olarak kullanılmasını öğrendikten sonra projenin çoğunu arttığını öğrendim. Artık çok iş parçacığı veya eşzamanlılık üzerinde fazla çalışmadım, bu yüzden gerçek projede kullanmadan önce öğrenmeye ve basit bir kavram kanıtı almaya karar verdim. Aşağıda
denedim iki örnek: Eşzamanlılık/çoklu iş akışı ne zaman performansı artırır?

1. With use of concurrency 

    public static void main(String[] args) 

    { 
     System.out.println("start main "); 

     ExecutorService es = Executors.newFixedThreadPool(3); 
     long startTime = new Date().getTime(); 
     Collection<SomeComputation> collection = new ArrayList<SomeComputation>(); 
     for(int i=0; i< 10000; i++){ 
      collection.add(new SomeComputation("SomeComputation"+i)); 
     } 
     try { 
      List<Future<Boolean>> list = es.invokeAll(collection); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     System.out.println("\n end main "+(new Date().getTime() - startTime)); 
    } 

2. Without use of concurrency 

     public static void main(String[] args) { 

      System.out.println("start main "); 
      long startTime = new Date().getTime(); 
      Collection<SomeComputation> collection = new ArrayList<SomeComputation>(); 
      for(int i=0; i< 10000; i++){ 
      collection.add(new SomeComputation("SomeComputation"+i)); 
     } 
     for(SomeComputation sc:collection) 
     { 
     sc.compute(); 
     } 
     System.out.println("\n end main "+(new Date().getTime() - startTime)); 
     } 

    Both share a common class 

     class SomeComputation implements Callable<Boolean> 
     { 
      String name; 
      SomeComputation(String name){this.name=name;} 
      public Boolean compute() 
      { 
       someDumbStuff(); 
       return true; 
      } 

      public Boolean call() 
      { 
       someDumbStuff(); 
       return true; 
      } 

      private void someDumbStuff() 
      { 
       for (int i = 0;i<50000;i++) 
       { 
        Integer.compare(i,i+1); 
       } 
       System.out.print("\n done with "+this.name); 
      } 
     } 

Şimdi her yaklaşımın 20 küsur çalıştıktan sonra analizi.
Birincisi eşzamanlı olarak ortalama 451 msn alır.
Eşzamanlı olmadan 2. biri ortalama 290 msn alır.
Şimdi bunun yapılandırma, işletim sistemi, sürüm (java 7) ve işlemciye bağlı olduğunu öğrendim. Ancak her ikisi de her iki yaklaşım için de aynıydı. Ayrıca hesaplama yoğun olduğu zaman eşzamanlılık maliyetinin uygun olduğunu öğrendim.Ancak bu nokta bana açık değildi.
Bazılarının bunu daha iyi anlamama yardımcı olmasını umarım.
PS: Benzer sorular bulmayı denedim ama bu tür bulabilirim.

+0

Geç Gene Amdahl, yararlı bulabileceğiniz bazı araştırmalar yaptı; ayrıca bkz. [Amdahl yasası] (https://en.wikipedia.org/wiki/Amdahl's_law). –

+0

Teşekkürler @ElliottFrisch. Şimdi onu okuyacağım. –

+0

"someDumbStuff" öğesindeki döngü süresini yaklaşık 1000000'e çıkarmayı deneyin ve daha beklenen bir trend görmeye başlayabilirsiniz. – flakes

cevap

1

Eşzamanlılık en az iki farklı amaca sahiptir: 1) performans ve 2) basit bir kod (web istekleri için 1000 dinleyici gibi).

Amacınız performans ise, çalışmaya koyduğunuz donanım çekirdeklerinden daha fazla hız kazanamazsınız. (Ve iş parçacığı yalnızca CPU bağlıysa.) Dahası, her iş parçacığının önemli bir başlangıç ​​ek yükü vardır. Yani, 4 çekirdekli bir makinede 1000 iş parçacığı başlatırsanız, 4x hızından daha iyi bir performans elde edemezsiniz, ancak buna karşı 1000 iş parçacığı başlatma maliyetiniz vardır.

+0

Cevabınız için teşekkürler .. Amacım performans. Iş parçacığı CPU bağlı olup olmadığından emin değil. Bu, belirli bir sınırlı çekirdek makine eşzamanlılığı ile anlamına gelmez mi? Çünkü _newFixedThreadPool_ içinde söylemek için iş parçacığı sayısını artırırsam zaman azalır .. ama cevabınız yine de yardımcı olur. –

+0

G/Ç, uyku, kilitleme yapmazlarsa veya bellek çalışma setlerinin fiziksel belleğe göre büyük olması durumunda, işlemeye izin vermedikçe CPU bağlanırlar. Haklısınız - mevcut çekirdek sayısından daha fazla eşzamanlı olmamalıdır. Çekirdeklerden daha fazla iş parçacığı varsa, mevcut donanım için birbirleriyle kavga ederler. Eğer eşzamanlı zamandan tasarruf etmenizi istiyorsanız, daha fazla çekirdek almanız gerekir. –

1

concurrecy parçacığı aynı veri kaynakları paylaşan bazı iplik bu kaynakla çalışırken onlar acces böylece senkronize Methode öğrenmeliyiz ve sahip olmadığı kadar işi bitirmek kadar diğerleri de beklemesi gerekir tabi bluck ya benim İngiliz olduğunu üzgün gibi bazı şey bu cevapları birinde belirtildiği gibi bu https://docs.oracle.com/javase/tutorial/essential/concurrency/syncmeth.html

1

yararlı olur Turial okumak, eşzamanlılık biri kullanılması yani orada mantıksal eşzamanlı olan bazı sorunlar var kod yani sadeliği sahip olmaktır Bu problemleri üretici - tüketici problemleri gibi eşzamanlı olmayan bir şekilde modellemenin bir yolu yoktur. Web istekleri vb daha

Diğer etmek eners, eş zamanlı program uygulanmasına ekler sadece eğer onun hedef meşgul her zaman CPU veya CPU tutmaktır yani için CPU döngülerini kaydetmek ve döngülerine, boşa mümkün olan Ayrıca, programınızın bir şeyle meşgul olması gerektiğinde CPU'nuzun yararlı bir şey yapmasına izin vermemeniz anlamına gelir. NON - Disk G/Ç Bekleme, Kilitleri Bekle, Uyku, GUI uygulaması kullanıcı beklemesi vb. gibi CPU görevleri toplam program çalışma süreniz.

Soru şu ki, Programınız bunu kullanmadığında CPU'nuz ne yapıyor? Bu süre zarfında programımın bir bölümünü tamamlayabilir ve başka bir iş parçacığında bekletme bölümünü ayırabilir miyim? Günümüzde, modern sistemlerin çoğu, programların eş zamanlı olmaması durumunda israfa yol açan çok işlemcili ve çok çekirdekli sistemlerdir.

Yazdığınız örnek, beklemedeki durumlardan herhangi birine girmeden tüm işlemleri belleğinizde yapmaktır; bu nedenle çok fazla kazanç görmezsiniz, yalnızca iş parçacığı ve bağlam değişimini ayarlamada bir kayıp görmezsiniz.

Bir DB'ye basarak performansı ölçmeye çalışın, 1 milyon kayıt alın, bu kayıtları işleyin ve sonra bu kayıtları yeniden DB'ye kaydedin. Bir kerede ardışık olarak ve küçük gruplar halinde gerçekleştirin, böylece DB işlemlerinin disk yoğun olduğu ve DB'ye yazdığınız veya yazdığınız zaman performans farkına dikkat edin, aslında Disk I/O yapıyorsunuz ve CPU döngü sırasında boşa harcanıyor. o zaman.

Bence

, eşzamanlılık için iyi bir aday aksi ayrıca eşzamanlılık için iyi aday olan bazı arka plan görevleri ihtiyaç çok gain.Programs görmüyorum yukarıda belirtilen bekleme operasyonlarından birini kapsayan uzun süren görevler bulunmaktadır.

Aynı anda aynı CPU üzerinde farklı programlar çalıştırdığınızda, eşzamanlılık CPU'nun çoklu görevlendirmesiyle karıştırılmamalıdır.

Umut eder!

+0

gerçekten çok yardımcı oldu. –