Cep telefonları basit işlemlerde ne kadar hızlı
____________________________________________________________________Hep merak ederdim, cep telefonları için tonla uygulama oyun vs. program var. VerdiÄŸimiz belli komutlarla o anda iÅŸlem yapan uygulamalar deÄŸil de cep telefonu oyunları da gerçekten iÅŸlemci canavarı. Eski SonyEricsson K610i telefonumda tonla Java oyunu vardı, ÅŸimdiki Toshiba G500 Portege da Java oyunları ile dolu. İki telefon da bir süre oyun oynadıktan sonra ısınıyor. Bunun elimin ısısından olabileceÄŸimi düşünüp elime almadan sadece tuÅŸları kullanarak Juiced 2 ya da NitroStreetRacing on MOBERs gibi araba yarışı oyunları ile denedim. Devamlı olarak ekrana birÅŸeyler çizen ve boyayan iÅŸlemci ve diÄŸer donanım bir süre sonra ısınmaya baÅŸlıyordu. Ben de bu bilgisayar iÅŸlemcisi gibi (henüz o kadar deÄŸil Allah’tan) ısınan iÅŸlemcilerin neler yapabildiklerini merak ediyordum.
Bu merakım için Jbenchmark gibi çeşitli Java ME test programları vs. kullandım. Ama benim merak ettiğim biraz farklı idi. Telefon örneğin belirli bir işlemi ne kadar sürede kaç kez yapabilirdi. Bunu ufak bir uygulama ile kontrol edeyim dedim.
Bazı farklı ÅŸeyler denedim ama buraya koyduÄŸum kodun tek yaptığı 0’dan 5 milyon’a kadar toplama yapmak. Bir de gelinen aÅŸama hakkında ekranda bilgi vermek. Tabi bu da her sayı artışında 11 kadar if veya switch kullanımı demek. Aslında tek merak ettiÄŸim kaç tane if için ne kadar sürede iÅŸlem yapacağıydı. Daha sonra bir de switch ne yapar deyip meraktan onu da kattım araya.
Buradaki işlem 0 sayısını for ile arttırarak 5 milyona kadar gelmek. Bu esnada da for içinde yer alan if veya switch ile sayıyı kontrol edip eğer karşılaştırılan değer ise ekrana bunu yazmak. Burada da 11 if veya switch var ve 5 milyona kadar her biri teker teker kontrol ediliyor. Bu da toplamda 60 milyon kadar if veya switch içinde karşılaştırma demek. En sonunda da işlemin başlatıldığı zaman bittiği zamandan çıkarılarak milisaniye cinsinden süre alınıyor. Bu süre 5 milyon adet toplama işleminin ve 60 milyon karşılaştırmanın yapıldığı toplam süre.
Uygulamayı üç farklı telefonda denedim. Bunlar; Toshiba G500 Portégé, SonyEricsson K700i ve Siemens C(ommodore) 65.
İlkinde 420 MHz Intel Xscale Strong ARM sınıfı ARM 9 920 T standardında bir iÅŸlemci var. Bir de Java yazılımı JBed bytecode üzerinde iyileÅŸtirme yapıyor hatta belki kodu makine diline de çeviriyor ve öyle saklıyor olabilir. Bu sebeple çoÄŸu iÅŸlemi bilgisayarda emülatörden daha hızlı yaptığı söylenebilir. Bu uygulamada 60 milyon karşılaÅŸtırma ve 5 milyon arttırmayı if kullanıldığında yaklaşık 1500 ms sürede switch ile ise 1000 ms’ye yakın bir sürede yapıyor.

If ile test

Switch ile test
İkinci alette yaklaşık 109 MHz frekansta bir ARM 9 işlemci var. Bunun da Jazelle desteği var, yani işlemci doğrudan Java bytecode için donanımsal desteğe sahip, kodu daha önceden makine diline çevirmeden çalıştırabiliyor. Bu telefon ise işlemi if ile yaklaşık 20 bin ms sürede yani 20 saniyede yapıyor, switch ile ise işlem 10 saniye kadar sürüyor. Diğer aygıt ile aradaki farkın nedeni işlemci frekansı ve Strong ARM spesifikasyonu tabi.
Son alet ise 102 – 109 MHz gibi frekansta bir iÅŸlemciye sahip ve derleyici sanal makineye sahip, Java bytecode uygulama açılışında makine koduna çeviriliyor ve çalıştırılıyor. Bu 2004 model alet if ile iÅŸlemi 5 – 10 saniye arası bir sürede tamamlıyor ve switch ile de 2 – 3 saniyede iÅŸlemi tamamlıyor.
60 milyon karşılaÅŸtırma ve 5 milyon toplama iÅŸlemi cep telefonlarında 1 sn ile 20 sn arası sürebiliyor demek ki. Merak ettiÄŸim de tam olarak bu idi, uygulamalarda cimri davransam da bir komut sonrası 500 – 1000 arası if kontrolü oluyor, demek ki en dandik telefon için bile bir zorluk deÄŸilmiÅŸ bu. Tabi karşılaÅŸtırılan veri tipi, karşılaÅŸtırma yöntemi vs. önemli ama kiÅŸisel merakımı gidermiÅŸ oldum. Ayrıca Cep Ingilizce‘deki yavaÅŸlığın Java’da InputStream yavaÅŸlığı ile alakalı olduÄŸunu anlamış oldum. InputStream ve String veri tipi ile if kontrolü ilk cihazda saniyede 15 bine inebiliyor, yani buradakinden yüzlerce kat daha az. Bir de nasıl olurda Siemens C(ommodore) 65, Jazelle destekli bir iÅŸlemciyi böyle basit bir iÅŸlemde yenebiliyor anlamıyorum. 🙂 Tarihi eser telefonumun büyük baÅŸarısı. 🙂 Bir de switch if den bir miktar daha hızlı, onu da gözle görüp emin olmuÅŸ oldum. 🙂
Aşağıdaki testi yaptığım uygulamanın kodları. Derlenmiş olarak buradan indirebilirsiniz:
İndir “Toplama test”
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
public class Toplama_Test extends MIDlet implements CommandListener {
Form anaForm = new Form("Toplama Test");
Command cikis = new Command("Çıkış",Command.EXIT,2);
Command iftest = new Command("If Test",Command.SCREEN,0);
Command casetest = new Command("Case Test",Command.SCREEN,1);
boolean baslangic = true;
public void startApp() {
if(baslangic){
anaForm.append("Telefonunuzun hızını test etmek için herhangi bir test komutu veriniz.");
anaForm.addCommand(iftest);
anaForm.addCommand(casetest);
anaForm.addCommand(cikis);
anaForm.setCommandListener(this);
Display.getDisplay(this).setCurrent(anaForm);
baslangic = false;
}
}public void pauseApp() {
}public void destroyApp(boolean unconditional) {
}public void commandAction(Command komut, Displayable d) {
if(komut == cikis)
{destroyApp(false);notifyDestroyed();}
if(komut == iftest){
while(anaForm.size()>1){anaForm.delete(anaForm.size()-1);}
long ilkzaman = System.currentTimeMillis();
for(int i = 0;i < 5000001;i++)
{//System.out.println(i);
if(i == 25000){long ilkSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("25000 = "+ilkSonuc+" ms\n");}
if(i == 50000){long ikinciSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("50000 = "+ikinciSonuc+" ms\n");}
if(i == 125000){long ucuncuSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("125000 = "+ucuncuSonuc+" ms\n");}
if(i == 250000){long dorduncuSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("250000 = "+dorduncuSonuc+" ms\n");}
if(i == 500000){long altinciSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("500000 = "+altinciSonuc+" ms\n");}
if(i == 750000){long yedinciSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("750000 = "+yedinciSonuc+" ms\n");}
if(i == 1000000){long sekizinciSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("1000000 = "+sekizinciSonuc+" ms\n");}
if(i == 2000000){long dokuzuncuSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("2000000 = "+dokuzuncuSonuc+" ms\n");}
if(i == 3000000){long onuncuSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("3000000 = "+onuncuSonuc+" ms\n");}
if(i == 4000000){long onbirinciSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("4000000 = "+onbirinciSonuc+" ms\n");}
if(i == 5000000)
{
long testSonuc = System.currentTimeMillis() - ilkzaman;
anaForm.append("0'dan 5000000'a kadar birer birer arttırma "+testSonuc+" milisaniyede yapılıyor.");
}
}
}
if(komut == casetest)
{
while(anaForm.size()>1){anaForm.delete(anaForm.size()-1);}
long ilkzaman = System.currentTimeMillis();
for(int i = 0;i < 5000001;i++)
{//System.out.println(i);
switch (i)
{
case 25000:long ilkSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("25000 = "+ilkSonuc+" ms\n");break;
case 50000:long ikinciSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("50000 = "+ikinciSonuc+" ms\n");break;
case 125000:long ucuncuSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("125000 = "+ucuncuSonuc+" ms\n");break;
case 250000:long dorduncuSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("250000 = "+dorduncuSonuc+" ms\n");break;
case 500000:long altinciSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("500000 = "+altinciSonuc+" ms\n");break;
case 750000:long yedinciSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("750000 = "+yedinciSonuc+" ms\n");break;
case 1000000:long sekizinciSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("1000000 = "+sekizinciSonuc+" ms\n");break;
case 2000000:long dokuzuncuSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("2000000 = "+dokuzuncuSonuc+" ms\n");break;
case 3000000:long onuncuSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("3000000 = "+onuncuSonuc+" ms\n");break;
case 4000000:long onbirinciSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("4000000 = "+onbirinciSonuc+" ms\n");break;
case 5000000:long testSonuc = System.currentTimeMillis() - ilkzaman;anaForm.append("0'dan 5000000'a kadar birer birer arttırma "+testSonuc+" milisaniyede yapılıyor.");break;
}
}
}
}
}