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 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

If ile test

Switch 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: [download#20#nohits]

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;
}
}
}
}
}