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:
  • 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.
  • 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.
  • 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
One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.