SlideShare una empresa de Scribd logo
1 de 74
Descargar para leer sin conexión
Static Optimization
of
PHP Bytecode
Nikita Popov
2
154
192 196
212
476 486
501
0
100
200
300
400
500
PHP 5.3 PHP 5.4 PHP 5.5 PHP 5.6 PHP 7.0 PHP 7.1 PHP 7.2
Req/Sec
Stolen from Rasmus
Wordpress 4.8-alpha @ 20c
3
154
192 196
212
476 486
501
0
100
200
300
400
500
PHP 5.3 PHP 5.4 PHP 5.5 PHP 5.6 PHP 7.0 PHP 7.1 PHP 7.2
Req/Sec
Stolen from Rasmus
Wordpress 4.8-alpha @ 20c
4
$a = 42;
$b = 24;
echo $a + $b;
Code
5
ASSIGN $a, 42
ASSIGN $b, 24
T0 = ADD $a, $b
ECHO T0
$a = 42;
$b = 24;
echo $a + $b;
Compile
Code
Opcodes
6
ASSIGN $a, 42
ASSIGN $b, 24
T0 = ADD $a, $b
ECHO T0
$a = 42;
$b = 24;
echo $a + $b;
Compile Virtual
Machine
Execute
Code
Opcodes
7
ASSIGN $a, 42
ASSIGN $b, 24
T0 = ADD $a, $b
ECHO T0
$a = 42;
$b = 24;
echo $a + $b;
Compile Virtual
Machine
Execute
Code
Opcodes
Optimize
8
ASSIGN $a, 42
ASSIGN $b, 24
T0 = ADD $a, $b
ECHO T0
$a = 42;
$b = 24;
echo $a + $b;
Compile Virtual
Machine
Execute
Code
Opcodes
Optimize
SSA
9
Optimizations
10
$c = $a + $b;
T0 = ADD $a, $b
ASSIGN $c, T0
Optimizations
Specialization
11
$c = $a + $b;
T0 = ADD $a, $b
ASSIGN $c, T0
$c = ADD $a, $b
Optimizations
Specialization
12
$c = $a + $b;
T0 = ADD $a, $b
ASSIGN $c, T0
$c = ADD $a, $b
$c = ADD_INT $a, $b
Optimizations
Specialization
13
$c = $a + $b;
T0 = ADD $a, $b
ASSIGN $c, T0
$c = ADD $a, $b
$c = ADD_INT $a, $b
$c = ADD_INT_NO_OVERFLOW $a, $b
Optimizations
Specialization
14
Optimizations
Constant Propagation
$a = 2;
$b = $a + 1;
echo $a * $b;
15
Optimizations
Constant Propagation
$a = 2;
$b = 3;
echo 6;
16
Optimizations
Constant Propagation & Dead Code Elimination
echo 6;
17
Optimizations
Inlining
18
Optimizations
Inlining
function test() {
var_dump(div(4, 2));
}
function div($a, $b) {
if ($b == 0) {
return -1;
}
return $a / $b;
}
19
Optimizations
Inlining
function test() {
var_dump(div(4, 2));
}
function div($a, $b) {
if ($b == 0) {
return -1;
}
return $a / $b;
}
function test() {
$a = 4;
$b = 2;
if ($b == 0) {
$retval = -1;
goto end;
}
$retval = $a / $b;
goto end;
end:
unset($a, $b);
var_dump($retval);
}
20
Optimizations
Inlining + CP
function test() {
var_dump(div(4, 2));
}
function div($a, $b) {
if ($b == 0) {
return -1;
}
return $a / $b;
}
function test() {
$a = 4;
$b = 2;
$retval = 2;
goto end;
end:
unset($a, $b);
var_dump(2);
}
21
Optimizations
Inlining + CP + DCE
function test() {
var_dump(div(4, 2));
}
function div($a, $b) {
if ($b == 0) {
return -1;
}
return $a / $b;
}
function test() {
var_dump(2);
}
22
SSA Form
and
Type Inference
23
$x = 42;
if (cond) {
$x = 42.0;
var_dump($x);
} else {
$x = "42";
var_dump($x);
}
var_dump($x);
Static Single Assignment (SSA) Form
24
$x = 42;
if (cond) {
$x = 42.0;
var_dump($x);
} else {
$x = "42";
var_dump($x);
}
var_dump($x);
Static Single Assignment (SSA) Form
Type of $x:
int|float|string
25
$x = 42;
if (cond) {
$x = 42.0;
var_dump($x);
} else {
$x = "42";
var_dump($x);
}
var_dump($x);
Static Single Assignment (SSA) Form
Type of $x here:
int
Type of $x here:
float
Type of $x here:
string
Type of $x here:
float|string
26
$x = 42;
if (cond) {
$x = 42.0;
var_dump($x);
} else {
$x = "42";
var_dump($x);
}
var_dump($x);
Static Single Assignment (SSA) Form
27
Static Single Assignment (SSA) Form
$x_1 = 42;
if (cond) {
$x_2 = 42.0;
var_dump($x_2);
} else {
$x_3 = "42";
var_dump($x_3);
}
var_dump($x_?);
28
Static Single Assignment (SSA) Form
$x_1 = 42;
if (cond) {
$x_2 = 42.0;
var_dump($x_2);
} else {
$x_3 = "42";
var_dump($x_3);
}
$x_4 = phi($x_2, $x_3);
var_dump($x_4);
29
Static Single Assignment (SSA) Form
$x_1 : int
$x_2 : float
$x_3 : string
$x_4 : float|string
$x_1 = 42;
if (cond) {
$x_2 = 42.0;
var_dump($x_2);
} else {
$x_3 = "42";
var_dump($x_3);
}
$x_4 = phi($x_2, $x_3);
var_dump($x_4);
30
Type Inference
$x = 42;
do {
$y = $x;
$x = $x + 3.14;
} while (cond);
var_dump($y);
31
Type Inference
$x_1 = 42;
do {
$x_2 = phi($x_1, $x_3);
$y_1 = $x_2;
$x_3 = $x_2 + 3.14;
} while (cond);
var_dump($y_1);
32
Type Inference
$x_1 = 42;
do {
$x_2 = phi($x_1, $x_3);
$y_1 = $x_2;
$x_3 = $x_2 + 3.14;
} while (cond);
var_dump($y_1);
33
Type Inference
$x_1 = 42;
do {
$x_2 = phi($x_1, $x_3);
$y_1 = $x_2;
$x_3 = $x_2 + 3.14;
} while (cond);
var_dump($y_1);
$x_1 : int
$x_2 : ∅
$y_1 : ∅
$x_3 : ∅
34
Type Inference
$x_1 = 42;
do {
$x_2 = phi($x_1, $x_3);
$y_1 = $x_2;
$x_3 = $x_2 + 3.14;
} while (cond);
var_dump($y_1);
$x_1 : int
$x_2 : ∅
$y_1 : ∅
$x_3 : ∅
35
Type Inference
$x_1 = 42;
do {
$x_2 = phi($x_1, $x_3);
$y_1 = $x_2;
$x_3 = $x_2 + 3.14;
} while (cond);
var_dump($y_1);
$x_1 : int
$x_2 : int
$y_1 : ∅
$x_3 : ∅
36
Type Inference
$x_1 = 42;
do {
$x_2 = phi($x_1, $x_3);
$y_1 = $x_2;
$x_3 = $x_2 + 3.14;
} while (cond);
var_dump($y_1);
$x_1 : int
$x_2 : int
$y_1 : ∅
$x_3 : ∅
37
Type Inference
$x_1 = 42;
do {
$x_2 = phi($x_1, $x_3);
$y_1 = $x_2;
$x_3 = $x_2 + 3.14;
} while (cond);
var_dump($y_1);
$x_1 : int
$x_2 : int
$y_1 : int
$x_3 : float
38
Type Inference
$x_1 = 42;
do {
$x_2 = phi($x_1, $x_3);
$y_1 = $x_2;
$x_3 = $x_2 + 3.14;
} while (cond);
var_dump($y_1);
$x_1 : int
$x_2 : int
$y_1 : int
$x_3 : float
39
Type Inference
$x_1 = 42;
do {
$x_2 = phi($x_1, $x_3);
$y_1 = $x_2;
$x_3 = $x_2 + 3.14;
} while (cond);
var_dump($y_1);
$x_1 : int
$x_2 : int|float
$y_1 : int
$x_3 : float
40
Type Inference
$x_1 = 42;
do {
$x_2 = phi($x_1, $x_3);
$y_1 = $x_2;
$x_3 = $x_2 + 3.14;
} while (cond);
var_dump($y_1);
$x_1 : int
$x_2 : int|float
$y_1 : int
$x_3 : float
41
Type Inference
$x_1 = 42;
do {
$x_2 = phi($x_1, $x_3);
$y_1 = $x_2;
$x_3 = $x_2 + 3.14;
} while (cond);
var_dump($y_1);
$x_1 : int
$x_2 : int|float
$y_1 : int|float
$x_3 : float
42
Type Inference
$a = 2**62;
$b = 2**62;
var_dump($a + $b);
// float(9.2233720368548E+18)
43
Type Inference
$a = 2**62;
$b = 2**62;
var_dump($a + $b);
// float(9.2233720368548E+18)
Accurate type inference requires value range inference!
44
Type Inference
$a = 2**62;
$b = 2**62;
var_dump($a + $b);
// float(9.2233720368548E+18)
Accurate type inference requires value range inference!
Same basic concept as type inference,
but technically more involved…
45
Optimization obstacles
46
eval()?
variable variables?
47
eval()?
variable variables?
Don't optimize functions using those!
48
function test() {
$foobar = 42;
func($foobar);
var_dump($foobar); // int(42)?
}
References
function func(&$ref) {
$ref = 24;
}
function test() {
$foobar = 42;
func($foobar);
var_dump($foobar); // int(42)? nope!
}
49
References
// file1.php
function func(&$ref) {
$ref = 24;
}
// file2.php
function test() {
$foobar = 42;
func($foobar);
var_dump($foobar); // int(42)? nope!
}
50
References
51
References
Files compiled
independently
// file1.php
function func(&$ref) {
$ref = 24;
}
// file2.php
function test() {
$foobar = 42;
func($foobar);
var_dump($foobar); // int(42)? nope!
}
52
The devil is in the details…
53
$a = 1;
$b = 1;
var_dump($a + $b); // ???
54
// file1.php
$a = 1;
$b = 1;
var_dump($a + $b); // ???
// file2.php
// EVIL CODE HERE
require 'file1.php';
55
// file1.php
$a = 1;
$b = 1;
var_dump($a + $b); // ???
// file2.php
$b = new class {
function __destruct() {
$GLOBALS['b'] = 2;
}
};
require 'file1.php'; // int(3)
56
Pseudo-main scope is a lost cause!
57
function test() {
$obj = new stdClass;
$obj->prop = 42;
// Code not using $obj in any way
var_dump($obj->prop); // ???
}
58
function test() {
$obj = new stdClass;
$obj->prop = 42;
// Code not using $obj in any way
var_dump($obj->prop); // ???
}
set_error_handler(function($_1, $_2, $_3, $_4, $scope) {
$scope['obj']->prop = "foobar";
});
59
function test() {
$obj = new stdClass;
$obj->prop = 42;
// Code not using $obj in any way
var_dump($obj->prop); // ???
}
set_error_handler(function($_1, $_2, $_3, $_4, $scope) {
$scope['obj']->prop = "foobar";
});
Could generate warning
60
function test() {
$obj = new stdClass;
$obj->prop = 42;
// Code not using $obj in any way
var_dump($obj->prop); // ???
}
set_error_handler(function($_1, $_2, $_3, $_4, $scope) {
$scope['obj']->prop = "foobar";
});
Could generate warning
95% of instructions have
some error condition
61
Object properties (and references)
are a lost cause :(
• Constant Propagation, Dead Code Elimination, etc. only really
effective with inlining
62
Inlining
• Constant Propagation, Dead Code Elimination, etc. only really
effective with inlining
• Inlining only works if callee is known
• Only within single file (thanks opcache)
• Non-private/final instance methods can be overridden
63
Inlining
• Constant Propagation, Dead Code Elimination, etc. only really
effective with inlining
• Inlining only works if callee is known
• Only within single file (thanks opcache)
• Non-private/final instance methods can be overridden
• Backtraces change
64
Inlining
65
Results
66
Results (microbenchmarks)
67
Results (libraries/applications)
• phpseclib RSA enc/dec: 18%
• Aerys Huffman coding: 8%
68
Results (libraries/applications)
• phpseclib RSA enc/dec: 18%
• Aerys Huffman coding: 8%
• WordPress: 3%
• MediaWiki: 1%
69
Type Inference Stats
70
State
• SSA + Type Inference in PHP 7.1
• Specialization in PHP 7.1
71
State
• SSA + Type Inference in PHP 7.1
• Specialization in PHP 7.1
• Inlining, Constant Propagation, DCE, etc. not in PHP 7.1
72
State
• SSA + Type Inference in PHP 7.1
• Specialization in PHP 7.1
• Inlining, Constant Propagation, DCE, etc. not in PHP 7.1
• Currently work underway on dynasm JIT using SSA + type
inference framework
73
State
• SSA + Type Inference in PHP 7.1
• Specialization in PHP 7.1
• Inlining, Constant Propagation, DCE, etc. not in PHP 7.1
• Currently work underway on dynasm JIT using SSA + type
inference framework
Nikita Popov, Biagio Cosenza, Ben Juurlink, and Dmitry Stogov.
Static optimization in PHP 7. In CC'17, pages 65-75. ACM, 2017.
http://nikic.github.io/pdf/cc17_static_optimization.pdf
74
@nikita_ppv
https://joind.in/talk/57be5
Questions?

Más contenido relacionado

La actualidad más candente

Perl.Hacks.On.Vim
Perl.Hacks.On.VimPerl.Hacks.On.Vim
Perl.Hacks.On.Vim
Lin Yo-An
 
Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02
Seri Moth
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)
Kang-min Liu
 

La actualidad más candente (20)

Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
Mirror, mirror on the wall: Building a new PHP reflection library (DPC 2016)
 
PHP 7 – What changed internally? (PHP Barcelona 2015)
PHP 7 – What changed internally? (PHP Barcelona 2015)PHP 7 – What changed internally? (PHP Barcelona 2015)
PHP 7 – What changed internally? (PHP Barcelona 2015)
 
PHP 7 – What changed internally?
PHP 7 – What changed internally?PHP 7 – What changed internally?
PHP 7 – What changed internally?
 
Being functional in PHP (DPC 2016)
Being functional in PHP (DPC 2016)Being functional in PHP (DPC 2016)
Being functional in PHP (DPC 2016)
 
PHP data structures (and the impact of php 7 on them), phpDay Verona 2015, Italy
PHP data structures (and the impact of php 7 on them), phpDay Verona 2015, ItalyPHP data structures (and the impact of php 7 on them), phpDay Verona 2015, Italy
PHP data structures (and the impact of php 7 on them), phpDay Verona 2015, Italy
 
Zend Certification Preparation Tutorial
Zend Certification Preparation TutorialZend Certification Preparation Tutorial
Zend Certification Preparation Tutorial
 
Opaque Pointers Are Coming
Opaque Pointers Are ComingOpaque Pointers Are Coming
Opaque Pointers Are Coming
 
"How was it to switch from beautiful Perl to horrible JavaScript", Viktor Tur...
"How was it to switch from beautiful Perl to horrible JavaScript", Viktor Tur..."How was it to switch from beautiful Perl to horrible JavaScript", Viktor Tur...
"How was it to switch from beautiful Perl to horrible JavaScript", Viktor Tur...
 
Perl.Hacks.On.Vim
Perl.Hacks.On.VimPerl.Hacks.On.Vim
Perl.Hacks.On.Vim
 
CLI, the other SAPI phpnw11
CLI, the other SAPI phpnw11CLI, the other SAPI phpnw11
CLI, the other SAPI phpnw11
 
Creating own language made easy
Creating own language made easyCreating own language made easy
Creating own language made easy
 
Diving into HHVM Extensions (php[tek] 2016)
Diving into HHVM Extensions (php[tek] 2016)Diving into HHVM Extensions (php[tek] 2016)
Diving into HHVM Extensions (php[tek] 2016)
 
Fantastic DSL in Python
Fantastic DSL in PythonFantastic DSL in Python
Fantastic DSL in Python
 
Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02Jsphp 110312161301-phpapp02
Jsphp 110312161301-phpapp02
 
Perl6 grammars
Perl6 grammarsPerl6 grammars
Perl6 grammars
 
Your code is not a string
Your code is not a stringYour code is not a string
Your code is not a string
 
Perl 6 in Context
Perl 6 in ContextPerl 6 in Context
Perl 6 in Context
 
Cli the other sapi pbc11
Cli the other sapi pbc11Cli the other sapi pbc11
Cli the other sapi pbc11
 
Create your own PHP extension, step by step - phpDay 2012 Verona
Create your own PHP extension, step by step - phpDay 2012 VeronaCreate your own PHP extension, step by step - phpDay 2012 Verona
Create your own PHP extension, step by step - phpDay 2012 Verona
 
Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)Good Evils In Perl (Yapc Asia)
Good Evils In Perl (Yapc Asia)
 

Similar a Static Optimization of PHP bytecode (PHPSC 2017)

JavaScript for PHP developers
JavaScript for PHP developersJavaScript for PHP developers
JavaScript for PHP developers
Stoyan Stefanov
 

Similar a Static Optimization of PHP bytecode (PHPSC 2017) (20)

Quality assurance for php projects with PHPStorm
Quality assurance for php projects with PHPStormQuality assurance for php projects with PHPStorm
Quality assurance for php projects with PHPStorm
 
PHPSpec BDD for PHP
PHPSpec BDD for PHPPHPSpec BDD for PHP
PHPSpec BDD for PHP
 
Building Testable PHP Applications
Building Testable PHP ApplicationsBuilding Testable PHP Applications
Building Testable PHP Applications
 
PHPSpec BDD Framework
PHPSpec BDD FrameworkPHPSpec BDD Framework
PHPSpec BDD Framework
 
Development by the numbers
Development by the numbersDevelopment by the numbers
Development by the numbers
 
Perl 6 by example
Perl 6 by examplePerl 6 by example
Perl 6 by example
 
10 Catalyst Tips
10 Catalyst Tips10 Catalyst Tips
10 Catalyst Tips
 
Zend Certification PHP 5 Sample Questions
Zend Certification PHP 5 Sample QuestionsZend Certification PHP 5 Sample Questions
Zend Certification PHP 5 Sample Questions
 
PHP Static Code Review
PHP Static Code ReviewPHP Static Code Review
PHP Static Code Review
 
Can't Miss Features of PHP 5.3 and 5.4
Can't Miss Features of PHP 5.3 and 5.4Can't Miss Features of PHP 5.3 and 5.4
Can't Miss Features of PHP 5.3 and 5.4
 
Functional php
Functional phpFunctional php
Functional php
 
Development By The Numbers - ConFoo Edition
Development By The Numbers - ConFoo EditionDevelopment By The Numbers - ConFoo Edition
Development By The Numbers - ConFoo Edition
 
PHP 5.4
PHP 5.4PHP 5.4
PHP 5.4
 
New in php 7
New in php 7New in php 7
New in php 7
 
Generated Power: PHP 5.5 Generators
Generated Power: PHP 5.5 GeneratorsGenerated Power: PHP 5.5 Generators
Generated Power: PHP 5.5 Generators
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy Code
 
A Functional Guide to Cat Herding with PHP Generators
A Functional Guide to Cat Herding with PHP GeneratorsA Functional Guide to Cat Herding with PHP Generators
A Functional Guide to Cat Herding with PHP Generators
 
C#7, 7.1, 7.2, 7.3 e C# 8
C#7, 7.1, 7.2, 7.3 e C# 8C#7, 7.1, 7.2, 7.3 e C# 8
C#7, 7.1, 7.2, 7.3 e C# 8
 
PHP and MySQL
PHP and MySQLPHP and MySQL
PHP and MySQL
 
JavaScript for PHP developers
JavaScript for PHP developersJavaScript for PHP developers
JavaScript for PHP developers
 

Último

Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Victor Rentea
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 

Último (20)

Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
Web Form Automation for Bonterra Impact Management (fka Social Solutions Apri...
 
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin WoodPolkadot JAM Slides - Token2049 - By Dr. Gavin Wood
Polkadot JAM Slides - Token2049 - By Dr. Gavin Wood
 
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024Finding Java's Hidden Performance Traps @ DevoxxUK 2024
Finding Java's Hidden Performance Traps @ DevoxxUK 2024
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
presentation ICT roal in 21st century education
presentation ICT roal in 21st century educationpresentation ICT roal in 21st century education
presentation ICT roal in 21st century education
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Vector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptxVector Search -An Introduction in Oracle Database 23ai.pptx
Vector Search -An Introduction in Oracle Database 23ai.pptx
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
AI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by AnitarajAI in Action: Real World Use Cases by Anitaraj
AI in Action: Real World Use Cases by Anitaraj
 
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
Navigating the Deluge_ Dubai Floods and the Resilience of Dubai International...
 
FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024FWD Group - Insurer Innovation Award 2024
FWD Group - Insurer Innovation Award 2024
 
ICT role in 21st century education and its challenges
ICT role in 21st century education and its challengesICT role in 21st century education and its challenges
ICT role in 21st century education and its challenges
 
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, AdobeApidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
Apidays New York 2024 - Scaling API-first by Ian Reasor and Radu Cotescu, Adobe
 
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot TakeoffStrategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
Strategize a Smooth Tenant-to-tenant Migration and Copilot Takeoff
 
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
Apidays New York 2024 - APIs in 2030: The Risk of Technological Sleepwalk by ...
 
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUKSpring Boot vs Quarkus the ultimate battle - DevoxxUK
Spring Boot vs Quarkus the ultimate battle - DevoxxUK
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Platformless Horizons for Digital Adaptability
Platformless Horizons for Digital AdaptabilityPlatformless Horizons for Digital Adaptability
Platformless Horizons for Digital Adaptability
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 

Static Optimization of PHP bytecode (PHPSC 2017)