drupal_get_path() has quite a few IO calls that aren't needed on sites after they have been deployed. Even if the static cache is hit, there's a few calls to file_exists() that get called anyways. For sites that are deployed with version control or something similar, we know that code isn't changing under us without an update and cache clear being run.
The attached patch adds optional caching support to drupal_get_filename(). I've kept it off by default as it could be a major DXWTF for local environments, and quite confusing for anyone who might be manually creating code files on servers. On one large code base, I'm getting a 20% performance improvement on an uncached anonymous page after the drupal_get_path() cache is warmed.
Here's ab results against a real site implementation. This is inside a vagrant VM, but the code is sync'ed with rsync so IO is against the local disk image and not over the network.
This is ApacheBench, Version 2.3 <$Revision: 1554214 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking local.sitename.com (be patient).....done
Server Software: Apache/2.4.7
Server Hostname: local.sitename.com
Server Port: 80
Document Path: /an-awesome-url
Document Length: 90716 bytes
Concurrency Level: 1
Time taken for tests: 256.821 seconds
Complete requests: 100
Failed requests: 0
Total transferred: 9127100 bytes
HTML transferred: 9071600 bytes
Requests per second: 0.39 [#/sec] (mean)
Time per request: 2568.206 [ms] (mean)
Time per request: 2568.206 [ms] (mean, across all concurrent requests)
Transfer rate: 34.71 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.1 0 0
Processing: 2450 2568 259.4 2540 5095
Waiting: 2385 2493 257.5 2466 5007
Total: 2450 2568 259.4 2540 5095
Percentage of the requests served within a certain time (ms)
50% 2540
66% 2555
75% 2567
80% 2576
90% 2609
95% 2647
98% 2701
99% 5095
100% 5095 (longest request)
After this patch, and setting $conf['cache_drupal_get_filename'] = TRUE;.
This is ApacheBench, Version 2.3 <$Revision: 1554214 $>
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Licensed to The Apache Software Foundation, http://www.apache.org/
Benchmarking local.sitename.com (be patient).....done
Server Software: Apache/2.4.7
Server Hostname: local.sitename.com
Server Port: 80
Document Path: /an-awesome-url
Document Length: 90716 bytes
Concurrency Level: 1
Time taken for tests: 202.005 seconds
Complete requests: 100
Failed requests: 0
Total transferred: 9127100 bytes
HTML transferred: 9071600 bytes
Requests per second: 0.50 [#/sec] (mean)
Time per request: 2020.047 [ms] (mean)
Time per request: 2020.047 [ms] (mean, across all concurrent requests)
Transfer rate: 44.12 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 1 11.7 0 117
Processing: 1948 2019 86.4 2009 2819
Waiting: 1877 1945 85.6 1936 2744
Total: 1948 2020 86.9 2009 2819
Percentage of the requests served within a certain time (ms)
50% 2009
66% 2023
75% 2031
80% 2036
90% 2054
95% 2074
98% 2120
99% 2819
100% 2819 (longest request)
I haven't looked at D8 yet to see if this is needed, but if this passes 7.x tests to make sure the idea isn't horribly broken I'll forward port it.
Needs work
11.0 🔥
It affects performance. It is often combined with the Needs profiling tag.
Not all content is available!
It's likely this issue predates Contrib.social: some issue and comment data are missing.