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.
Geç Gene Amdahl, yararlı bulabileceğiniz bazı araştırmalar yaptı; ayrıca bkz. [Amdahl yasası] (https://en.wikipedia.org/wiki/Amdahl's_law). –
Teşekkürler @ElliottFrisch. Şimdi onu okuyacağım. –
"someDumbStuff" öğesindeki döngü süresini yaklaşık 1000000'e çıkarmayı deneyin ve daha beklenen bir trend görmeye başlayabilirsiniz. – flakes