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.0beta1Untuk 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
  • 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
$ 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!