Thursday, June 29, 2006

J2ME Profiling dengan Wireless Toolkit

Yohanes Wayan — 203115008



Profiling adalah tindakan mencari bagian sistem yang performanya kurang untuk dioptimasi belakangan.

Profiling cukup penting karena prosesor pada mobile device agak lambat sehingga operasi yang biasanya pada desktop tidak terasa lambatnya dapat jadi mengganggu pada mobile device.



Mencoba Profiling



Buat new project dengan nama ProfileTest dan nama MIDlet ProfileTest. Program di bawah ini (ProfileTest.java) akan mendemonstrasikan salah satu hal yang banyak mengakibatkan alokasi objek tidak diperlukan yaitu penggunaan String secara tidak tepat (membuat string seperti "1, 2, 3, 4, ..." dari array). Sebagai perbandingannya digunakan StringBuffer dengan method append().




import javax.microedition.lcdui.*;
import javax.microedition.midlet.*;

public class ProfileTest
extends MIDlet
implements CommandListener {
private Form mMainForm;
private StringItem mStringItem;
private Command mExitCommand, mTestStringCommand, mTestStringBufferCommand;
private int[] mSomeIntegers = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
private static int TIMES = 10;

public ProfileTest() {
mMainForm = new Form("HelloMIDlet");
mStringItem = new StringItem(null, "Hello, MIDP!");
mMainForm.append(mStringItem);
mExitCommand = new Command("Exit", Command.SCREEN, 0);
mTestStringCommand = new Command("Test String", Command.SCREEN, 0);
mTestStringBufferCommand = new Command("Test StringBuffer", Command.SCREEN, 0);
mMainForm.addCommand(mExitCommand);
mMainForm.addCommand(mTestStringCommand);
mMainForm.addCommand(mTestStringBufferCommand);
mMainForm.setCommandListener(this);
}

public void startApp() {
Display.getDisplay(this).setCurrent(mMainForm);
}

public void pauseApp() {}

public void destroyApp(boolean unconditional) {}

public void commandAction(Command c, Displayable s) {
if (c == mExitCommand)
notifyDestroyed();
else if (c == mTestStringCommand)
testString();
else if (c == mTestStringBufferCommand)
testStringBuffer();
}
public void testString() {
String temp = "";
for (int times = 0; times < TIMES; times++) {
for (int i = 0; i < mSomeIntegers.length; i++) {
temp = temp + mSomeIntegers[i];
if (i < mSomeIntegers.length - 1) temp = temp + ", ";
}
}
mStringItem.setText(temp);
}
public void testStringBuffer() {
StringBuffer temp = new StringBuffer();
for (int times = 0; times < TIMES; times++) {
for (int i = 0; i < mSomeIntegers.length; i++) {
temp = temp.append(mSomeIntegers[i]);
if (i < mSomeIntegers.length - 1) temp.append(", ");
}
}
mStringItem.setText(temp.toString());
}
}


Nyalakan profiling di menu Edit > Preferences… bagian Monitor. Centang Enable Profiling dan Enable Memory Monitor. Untuk mensimulasikan lambatnya prosesor, centanglah Enable VM speed emulation pada tab Performance dan aturlah slidernya ke level yang sesuai.



Apabila program anda sekarang dijalankan dengan tombol Run maka akan muncul window Memory Monitor yang akan menampilkan jumlah byte yang dialokasi dan jumlah objek lengkap dengan graph alokasi. Cobalah menjalankan program dan mencoba pilihan Test String dan Test StringBuffer serta perhatikan bagaimana jumlah objek meningkat tajam ketika menggunakan String (di sini 248 (sesudah GC) jadi 1042) dan hanya meningkat sedikit saja ketika menggunakan StringBuffer (di sini 248 (sesudah GC) jadi 272). Ketika emulator ditutup maka akan tampak window Method Profiler dengan tampilan Call Graph di sebelah kiri dan tampilan method di sebelah kanan lengkap dengan berapa kali dipanggilnya dan jumlah Cycle yang dihabiskannya. Di sini meskipun sama-sama dipanggil dua kali, method testString menghabiskan 512813191 cycle dan method testStringBuffer menghabiskan 7781136 cycle. Tampak bahwa menggunakan StringBuffer lebih efisien.



Kesimpulan



Profiling penting untuk mencari tempat yang potensial ditingkatkan performancenya. Meskipun Wireless Toolkit menyediakan Profiler tapi jangan lupa melakukan tes pada device yang sebenarnya. Juga jangan lupa bahwa bagi user performance yang kelihatan (perceived performance) lebih penting oleh karena itu jangan sampai aplikasi anda terlihat tidak responsif meskipun sedang melakukan proses. Lebih baik aplikasi anda menampilkan layar menunggu dengan Gauge meskipun akan memakan waktu sedikit lebih lama daripada tampak hang.



Referensi



New Features in the J2ME Wireless Toolkit 1.0.4

http://developers.sun.com/techtopics/mobility/midp/articles/wtk104/

Wireless Development Tutorial Part I

http://developers.sun.com/techtopics/mobility/midp/articles/wtoolkit/

No comments: