330 likes | 486 Views
HipHop : High-Performance PHP Ali-Reza Adl-Tabatabai HipHop Team Facebook. Facebook: Move fast & build things. PHP. General-purpose scripting language tailored for web development Interactive Weakly typed & dynamic. <?php var_dump(6 + 7); var_dump('6' + '7');
E N D
HipHop: High-Performance PHPAli-Reza Adl-TabatabaiHipHop TeamFacebook
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(13) • int(0) • int(-9223372036854775808) • float(-1.844674407371E+19)
PHP • General-purpose scripting language tailored for web development • Interactive • Weakly typed & dynamic • function foo($x) { • echo “foo: “. $x. ”\n”;} • foo(“hello”); // prints “foo: hello” • foo(10); // prints “foo: 10”
PHP • General-purpose scripting language tailored for web development • Interactive • Weakly typed & dynamic • if (...) { • class B { ... } • } else { • class B { ... } • } • class C extends B { ... }
PHP • General-purpose scripting language tailored for web development • Interactive • Weakly typed & dynamic • $a = ‘f’; • $b = ‘c’; • $c = ‘oo’; • $func = $a . $ $b; • $func();
PHP • General-purpose scripting language tailored for web development • Interactive • Weakly typed & dynamic • 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”
PHP • 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 • 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
Performance... Source: http://shootout.alioth.debian.org/u64q/benchmark.php?test=all&lang=all
Implications for Facebook INTERNET • Bad performance can limit user features • Poor efficiency requires lots of re$ource$ . . . webservers . . . storage
What have we done? Facebook (PHP) Facebook (binary) PHP/Zend Apache
HipHopcompilation flow hphpc Facebook (PHP) Facebook (C++) Gcc PHP Runtime Webserver Facebook (binary)
HipHopcompiler (hphpc) PHP AST C++ Parser C++ Code Generator Optimize, Infer Types
Representing PHP data type data KindOfString & “Loremipsum.” KindOfInt 13
Type inference: fewer tags! type data & “Loremipsum.” 13
Basic operations $a + $b
Basic operations: type dispatch switch (a->m_type) { case KindOfInt: switch (b->m_type) { … } case KindOfArray: switch (b->m_type) { … } … } …} $a + $b $a + $b
Type inference: avoiding dispatch add %rcx, %rdx $a + $b given$a :: Int,$b :: Int
HipHop compiler: performance Disclaimer: estimated based on running Facebook
HipHop compiler: pros & cons • Good for production servers • Inadequatefor development • Solution: the HipHop interpreter (hphpi) • Leverages HipHop runtime & webserver • Open problem: Can we get the best of both worlds? hphpi hphpc ≠
HipHop Virtual Machine(hhvm) • Ambitious goal: replace both the HipHopInterpreter and Compiler HHVM Interpreter PHP AST HHBC Parser Bytecode Generator HHVM JIT Optimize, Infer Types
HipHopbytecode (hhbc) 96: Loc 0 101: Loc 1 106: IssetM <H E> 113: JmpZ 32 118: String “Hit! “ 123: Loc 0 128: Loc 1 133: CGetM <H E> 140: Concat 141: Print 142: PopC 143: True 144: RetC 145: String “Miss!” 150: Print 151: PopC 152: False 153: RetC • In-house design • Stack-base VM • Closer to PHP than machine code function lookup($cache, $key) { if (isset($cache[$key])) { echo “Hit! “ . $cache[$key]; return true; } else { echo “Miss!”; return false; } }
Hhvm JIT • Beyond static type inference: dynamic type specialization • Observe types • Generate specialized code • Guards to check types ;; 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$0x40000000, %r8 mov%r8, -8(%rbp) mov%r13, -16(%rbp) 224: Loc 0 229: Int 3 238: Loc 0 243: CGetH 244: Mul 245: Int 1 254: Add 255: SetH 256: PopC $n = 3 * $n + 1;
Translation cache: Reuse & specialization $n = 1.5; ... $n = 3 * $n + 1; Translator . . . __retranslate: . . . Translation Cache T2: T1: ;; Typecheck: INT($n)? cmpl $4, -4(%rbp) jne __retranslate ;; Typecheck: DOUBLE($n)? cmpl $8, -4(%rbp) jne __retranslate T2 ;; Type-spec INT ;; translation . . . ;; Type-spec DOUBLE ;; translation . . .
Current state • hhpc • Runs www.facebook.com • Paper to appear in SPLASH ‘12 • hhvm • www.facebook.com works • Developers using it • ~27% slower than hphpc • Download from github: https://github.com/facebook/hiphop-php/
Perfprogress 6/11-7/14
Ongoing & future work • Performance • Profile-guided, SSA-based 2nd 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
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
Thanks! Questions?