Het is sneller dan substr() ja. Maar vergelijk het eens met chunk_split. Dan is het ineens bijna 40% trager!
En in dit geval is de regexp nog redelijk snel. Zie onderaan de post trouwens voor een APD Trace.
De regel voor een regexp is over het algemeen:
-> Als je moet kiezen tussen een regexp en een zelf geschreven PHP Functie is een regexp sneller
-> Als je kan kiezen tussen een regexp en een andere PHP Functie die hetzelfde kan, is de andere PHP Functie sneller.
De preg_replace is intern namelijk wel een mooie C-functie in Zend (en geen extension):
PHP:
1
2
3
4
5
6
7
8
9
| <?php
$string = "00001ad3b32fdd596d31283800000000";
$splitted_string = preg_replace("/(.{8})/", "\\1 ", $string);
echo $splitted_string;
?> |
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| Bert Slagter@bert-laptop /usr/src/php-4.3.4
$ ./sapi/cli/php ./test.php
Class stdClass: [no user functions]
Class __PHP_Incomplete_Class: [no user functions]
Class Directory: [no user functions]
filename: /usr/src/php-4.3.4/test.php
function name: (null)
number of ops: 12
line # op fetch ext operands
-------------------------------------------------------------------------------
3 0 FETCH_W $0, 'string'
1 ASSIGN $0, '00001ad3b32fdd596d31283800000000'
5 2 SEND_VAL '%2F%28.%7B8%7D%29%2F'
3 SEND_VAL '%5C1+'
4 FETCH_R $3, 'string'
5 SEND_VAR $3
6 DO_FCALL 3 $4, 'preg_replace', 0
7 FETCH_W $2, 'splitted_string'
8 ASSIGN $2, $4
7 9 FETCH_R $6, 'splitted_string'
10 ECHO $6
10 11 RETURN 1
00001ad3 b32fdd59 6d312838 00000000 |
Dit is trouwens gemaakt met de
"Vulcan Logic Disassambler" van Derrick Rethans (Een nederlandse PHP devver).
test3.php
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
| <?php
apd_set_pprof_trace();
$string = "00001ad3b32fdd596d31283800000000";
for($i=0; $i < 10000; $i++)
{ $splitted_string = preg_replace("/(.{8})/", "\\1 ", $string);
}
echo $splitted_string;
?> |
code:
1
2
3
4
5
6
7
8
9
10
11
| Trace for /home/bslagter/test/test3.php
Total Elapsed Time = 0.35
Total System Time = 0.01
Total User Time = 0.34
Real User System secs/ cumm
%Time (excl/cumm) (excl/cumm) (excl/cumm) Calls call s/call Memory Usage Name
--------------------------------------------------------------------------------------
100.0 0.35 0.35 0.34 0.34 0.01 0.01 10000 0.0000 0.0000 0 preg_replace
0.0 0.00 0.00 0.00 0.00 0.00 0.00 1 0.0000 0.0000 0 main |
[
Voor 3% gewijzigd door
Burat op 10-11-2003 11:33
]