HipHop: High-Performance PHP Ali-Reza Adl-Tabatabai HipHop Team Facebook
Facebook: Move fast & build things 3
PHP General-purpose scripting language tailored for web development Interactive Weakly typed & dynamic <?php var_dump(6 + 7); var_dump('6' + '7'); var_dump('six' + 'seven'); var_dump((1<<63) + 0); var_dump((1<<63) + (1<<63)); int(13) int(0) int( ) float( E+19) 4
PHP function foo($x) { echo “foo: “. $x. ”\n”; } foo(“hello”); // prints “foo: hello” foo(10); // prints “foo: 10” 5 General-purpose scripting language tailored for web development Interactive Weakly typed & dynamic
PHP if (...) { class B {... } } else { class B {... } } class C extends B {... } 6 General-purpose scripting language tailored for web development Interactive Weakly typed & dynamic
PHP $a = ‘f’; $b = ‘c’; $c = ‘oo’; $func = $a. $ $b; $func(); 7 General-purpose scripting language tailored for web development Interactive Weakly typed & dynamic
PHP class C { public $declProp = 1; } $obj = new C; $obj->dynProp = 2; // This is OK! echo $obj->declProp. “\n”; // prints “1” echo $obj->dynProp. “\n” // prints “2” 8 General-purpose scripting language tailored for web development Interactive Weakly typed & dynamic
PHP 9 General-purpose scripting language tailored for web development Interactive Weakly typed & dynamic if (function_exists(‘foo’)) {... } if (class_exists($c)) {... }
Memory management PHP is reference counted Precise destruction semantics 10 class C { function __destruct() { echo “bye!”; } } $x = new C; $x = 1; // prints “bye!”
Concurrency Single-threaded programming model Multiple requests run in parallel No shared memory, synchronization, or direct communication 11
Performance... Source: 12
Implications for Facebook 1.Bad performance can limit user features 2.Poor efficiency requires lots of re$ource$ INTERNET webservers storage... 13
What have we done? Apache Facebook (PHP) PHP/Zend Facebook (binary) Facebook (binary) 14
HipHop compilation flow 15 Facebook (PHP) Facebook (PHP) hphpc Facebook (C++) Facebook (C++) PHP Runtime Webserver Gcc Facebook (binary) Facebook (binary)
HipHop compiler (hphpc) 16 PHP AST Optimize, Infer Types Parser C++ C++ Code Generator VariantDoubleInteger Boolea n StringArrayObject
Representing PHP data type data KindOfString& “Lorem ipsum.” KindOfInt13
Type inference: fewer tags! data & “Lorem ipsum.” 13 type
Basic operations $a + $b
Basic operations: type dispatch $a + $b$a + $b switch (a->m_type) { case KindOfInt: switch (b->m_type) { … } case KindOfArray: switch (b->m_type) { … } … } … } $a + $b
Type inference: avoiding dispatch $a + $b given $a :: Int,$b :: Int add %rcx, %rdx
HipHop compiler: performance 22 Disclaimer: estimated based on running Facebook
HipHop compiler: pros & cons Good for production servers Inadequate for development – Solution: the HipHop interpreter (hphpi) Leverages HipHop runtime & webserver Open problem: 23 Can we get the best of both worlds? hphpi ≠ hphpc
HipHop Virtual Machine (hhvm) Ambitious goal: replace both the HipHop Interpreter and Compiler 24 PHP AST Optimize, Infer Types Parser HHBC Bytecode Generator HHVM Interpreter HHVM JIT HHVM JIT
HipHop bytecode (hhbc) In-house design Stack-base VM Closer to PHP than machine code 25 function lookup($cache, $key) { if (isset($cache[$key])) { echo “Hit! “. $cache[$key]; return true; } else { echo “Miss!”; return false; } 96: Loc 0 101: Loc 1 106: IssetM 113: JmpZ : String “Hit! “ 123: Loc 0 128: Loc 1 133: CGetM 140: Concat 141: Print 142: PopC 143: True 144: RetC 145: String “Miss!” 150: Print 151: PopC 152: False 153: RetC
Hhvm JIT Beyond static type inference: dynamic type specialization 1.Observe types 2.Generate specialized code 3.Guards to check types 26 $n = 3 * $n + 1; 224: Loc 0 229: Int 3 238: Loc 0 243: CGetH 244: Mul 245: Int 1 254: Add 255: SetH 256: PopC ;; Typecheck: int($n)? cmpl $4, -4(%rbp) jne __retranslate ;; Type-spec xlation mov $3, %r12d mov -16(%rbp), %r13 mov %r13, %r14 imul %r14, %r12 add $1, %r12 mov %r12, %r13 mov $0x , %r8 mov %r8, -8(%rbp) mov %r13, -16(%rbp)
Translation cache: Reuse & specialization 27 ;; Typecheck: INT($n)? cmpl $4, -4(%rbp) jne __retranslate ;; Type-spec INT ;; translation... Translation Cache T1: Translator... __retranslate:... Translator... __retranslate:... ;; Typecheck: DOUBLE($n)? cmpl $8, -4(%rbp) jne __retranslate ;; Type-spec DOUBLE ;; translation... T2: T2 $n = 1.5;... $n = 3 * $n + 1;
Current state hhpc – Runs – Paper to appear in SPLASH ‘12 hhvm – works – Developers using it – ~27% slower than hphpc Download from github: 28
Perf progress 6/11-7/14
Ongoing & future work Performance – Profile-guided, SSA-based 2 nd gear JIT – Type prediction – Tuning for the HW – Array shapes: turn hash tables into structs Tracing garbage collection – Copy-on-write arrays – Precise destruction semantics Language extensions 30
Summary PHP enables us to move fast Performance suffers because of interpreter Hiphop compiler – Compiles PHP to C++ offline – Significantly improves user experience & data center efficiency HipHop virtual machine – A new language VM tailored to PHP – Brings dynamic JIT compilation & optimization to PHP Both open sourced on github 31
Thanks! Questions?