Regex performance benchmark between C, PHP5, PHP7 and HHVM3.8

Introduction

Ini bermula dari niat saya untuk mempelajari library regex dalam bahasa C. Dalam proses itu, saya coba implementasi kembali sebuah class kecil yang ada di aplikasi kita ke dalam bahasa C untuk membandingkan peformance code C saya, HHVM 3.8, PHP7 dan PHP5. Code C saya kemungkinan besar tidak begitu optimal karena pengetahuan C saya masih basic.

Namun menjadi harapan saya hasil eksperimen ini mungkin menarik bagi kalian.

Code

Saya menulis sebuah class yang kecil yang bernama TextCleanser. Kelas ini bisa digunakan untuk membuang character tertentu dari satu string.

Versi PHP bisa dilihat disini TextCleanser.php

Versi C bisa dilihat disini text_cleanser.c

Kedua-duanya berfungsi persis sama. Apabila diberi string seperti

Given => test L'oreal `` "test" ' *hoho*"
Result=> test Loreal  test  hoho

Saya juga menulis test runner untuk PHP dan C yang mengetest kedua-dua implementasi text cleanser ini dengan sebelas string tertentu dan bisa menjalankan-nya didalam loop yand ditentukan berdasarkan command-line parameter yang diberi.

Version information

Semua test ini dijalankan di dalam VM Ubuntu 14.04. Untuk semua kasus, test diloop sebanyak 1,000,000 kali lalu diambil hasil rata-rata.

Untuk versi C, ia di compile dengan menggunakan gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2 dan optimization flag -O3.

Untuk HHVM, versi yang dipakai adalah – HipHop VM 3.8.0 (rel)
Untuk PHP7, versi yang dipakai adalah – PHP 7.0.0beta1
Untuk PHP5, versi yang dipakai adalah – PHP 5.5.9-1ubuntu4.11

Untuk ketiga-tiga PHP5, PHP7 dan HHVM saya menjalankan test ini dengan menggunakan default configuration.

Hasilnya

PHP5

$ time php5 TextCleanserTest.php 1000000

        Run1       Run2       Run3
real    1m39.198s  1m39.167s  1m38.978s
user    1m38.613s  1m38.444s  1m38.358s
sys     0m0.028s   0m0.088s   0m0.060s

Average real: 1m39.114s

PHP7

$ time php7.0 TextCleanserTest.php 1000000
       
        Run1       Run2       Run3
real    0m42.677s  0m43.271s  0m44.700s
user    0m42.429s  0m43.009s  0m44.401s
sys     0m0.016s   0m0.016s   0m0.024s

Average real: 43.549s

C

$ time ./test_text_cleanser 1000000
        
        Run1       Run2       Run3
real    0m23.155s  0m22.750s  0m23.131s
user    0m23.029s  0m22.621s  0m22.998s  
sys     0m0.016s   0m0.004s   0m0.012s

Average real: 23.012s

HHVM

$ hhvm TextCleanserTest.php 1000000

real    0m22.391s  0m21.950s  0m22.156s
user    0m22.233s  0m21.806s  0m21.995s 
sys     0m0.016s   0m0.020s   0m0.032s

Average real: 22.166s

Kesimpulan

Final result: HHVM < C < PHP7 < PHP5

Harus diingat bahawa use case test ini sangat specific dan kemungkinan besar ada yang bisa menulis kode C yang jauh lebih baik dari kode yang saya tulis untuk test ini.

Namun secara garis besar ada tiga kesimpulan yang bisa kita ambil:

  1. Compiler + runtime suatu language memainkan peranan sangat besar dalam menentukan performance language tersebut. Dalam kata lain, tidak perlu dipersoalkan apakah PHP lebih cepat dari Ruby atau Python jika compiler + runtime bahasa tersebut tidak diperhitungkan.
  2. Compiler yang bisa menghasilkan code JIT seperti HHVM, Java Hotspot Compiler dan compiler berbasis LLVM akan bisa menghasilkan kode yang hampir secepat C-code setelah cukup matang.
  3. Benchmarking dan performance analisis adalah cukup penting dalam menentukan apakah usaha yang akan dimasukkan untuk porting sebagian code kamu ke bahasa yang lebih low level karena performance akan berhasil atau tidak. Daripada mengganti language, mungkin lebih baik mengganti compiler dan runtime saja.

Mengulangi eksperimen

Bagi anda yang mau mengulangi eksperimen ini, anda boleh ulangi step berikut untuk compile C-codenya di Ubuntu.

$ tar -xvjf pcre2-10.20.tar.bz2
$ ./configure --enable-jit
$ make
$ make install
  • Compile test_text_cleanser
$ git clone git@github.com:mohangk/playing_with_regex.git
$ cd playing_with_regex
$ make
  • Kamu seharusnya bisa run ./test_text_cleanser seperti diatas sekarang.

JOIN US!

Apakah kamu rasa menggunakan tools seperti HHVM, membuat performance analysis atau menulis C menarik ? Kalau ya, join us! KMKLabs masih ada banyak lowongan kerja yang terbuka. Kamu bisa apply melalui Website kami

Regex performance benchmark between C, PHP5, PHP7 and HHVM3.8

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s