Performance
===========

Composer's `vendor/autoload.php` file [requires all Safe files](https://github.com/thecodingmachine/safe/blob/05925e1d2abe0c0fee2095c1d569a1302a1a209e/composer.json#L13-L97)
on each request (since there is [no autoloading for functions in PHP](https://wiki.php.net/rfc/function_autoloading)).

"Requiring" those ~84 files in PHP has a performance impact. We used [Blackfire](http://blackfire.io/) to time precisely the impact of loading the PHP files.

Results
-------

| ||
|-----------------------------------------------------------------------------------------------------------|-------|
|[Composer autoload without Safe](https://blackfire.io/profiles/cb9122ac-69a7-4e90-9ea7-bf7561058815/graph) | 264µs |
|[Composer autoload with Safe](https://blackfire.io/profiles/35eb02eb-60f8-480a-bad0-0cfc43179c18/graph) | 1.03ms |

Safe load time: **~700µs**

Only 700µs for loading 84 files containing 1000+ functions. Damn, PHP is fast! Opcache does a very good job.

The tests have been performed on a DELL XPS 9550 laptop running Ubuntu 18.04 and Docker. CPU: [Intel(R) Core(TM) i7-6700HQ](https://ark.intel.com/products/88967/Intel-Core-i7-6700HQ-Processor-6M-Cache-up-to-3-50-GHz-)

Reproducing the test
--------------------

There are 2 test files:

- `test_with_safe/index.php`: loads Composer autoloader with Safe
- `test_without_safe/index.php`: loads Composer autoloader without Safe

Both test files are only loading Composer autoloader (with and without Safe), then echoing "foo".

For each file, you need to install the Composer dependencies:

```bash
cd test_with_safe
composer install
cd ..
cd test_without_safe
composer install
cd ..
```

A `docker-compose.yml` file is provided to start a PHP 7.2 environment with Blackfire enabled.

To start the environment, simply type:

```bash
BLACKFIRE_SERVER_ID=[xyz] BLACKFIRE_SERVER_TOKEN=[abc] docker-compose up
```

You can now browse to `http://localhost:8888/test_with_safe` and `http://localhost:8888/test_without_safe` and profile it using the [Blackfire companion](https://blackfire.io/docs/integrations/firefox)

