1
0
mirror of https://github.com/php/php-src.git synced 2026-04-28 18:53:33 +02:00
Files
archived-php-src/ext/standard/tests/strings/strtolower.phpt
T
Alex Dowad 0b7986f976 Tweak SSE2-accelerated strtoupper() and strtolower() for speed
I learned this trick for doing a faster bounds check with both upper
and lower bounds by reading a disassembler listing of optimized code
produced by GCC; instead of doing 2 compares to check the upper and the
lower bound, add an immediate value to shift the range you are testing
for to the far low or high end of the range of possible values for the
type in question, and then a single compare will do. Intstead of
compare + compare + AND, you just do ADD + compare.

From microbenchmarking on my development PC, this makes strtoupper()
about 10% faster on long strings (~10,000 bytes).
2023-01-20 08:21:45 +02:00

357 lines
4.5 KiB
PHP

--TEST--
Test strtolower() function
--FILE--
<?php
echo "*** Testing strtolower() with 256 chars ***\n";
for ($i=0; $i<=255; $i++){
$char = chr($i);
print(bin2hex($char))." => ".(bin2hex(strtolower("$char")))."\n";
}
echo "*** Testing strlower() with basic strings ***\n";
$str = "Mary Had A liTTle LAmb and ShE loveD IT So\n";
var_dump(strtolower($str));
echo "\n*** Testing strtolower() with various strings ***";
/* strings to pass strtolower() */
$strings = array (
"",
"string",
"stRINg0234",
"1.233.344StrinG12333",
"$$$$$$!!!!@@@@@@@ ABCDEF !!!***",
"ABCD\0abcdABCD",
TRUE,
FALSE,
/* Check for off-by-one errors in the SSE implementation */
"AAAAAAAAAAAAAAAAAAAA",
"ZZZZZZZZZZZZZZZZZZZZ",
"@@@@@@@@@@@@@@@@@@@@",
"[[[[[[[[[[[[[[[[[[[[",
"abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"
);
$count = 0;
/* loop through to check possible variations */
foreach ($strings as $string) {
echo "\n-- Iteration $count --\n";
var_dump( strtolower($string) );
$count++;
}
echo "\n*** Testing strtolower() with two different case strings ***\n";
if (strtolower("HeLLo woRLd") === strtolower("hEllo WORLD"))
echo "strings are same, with Case Insensitive\n";
else
echo "strings are not same\n";
echo "*** Done ***";
?>
--EXPECTF--
*** Testing strtolower() with 256 chars ***
00 => 00
01 => 01
02 => 02
03 => 03
04 => 04
05 => 05
06 => 06
07 => 07
08 => 08
09 => 09
0a => 0a
0b => 0b
0c => 0c
0d => 0d
0e => 0e
0f => 0f
10 => 10
11 => 11
12 => 12
13 => 13
14 => 14
15 => 15
16 => 16
17 => 17
18 => 18
19 => 19
1a => 1a
1b => 1b
1c => 1c
1d => 1d
1e => 1e
1f => 1f
20 => 20
21 => 21
22 => 22
23 => 23
24 => 24
25 => 25
26 => 26
27 => 27
28 => 28
29 => 29
2a => 2a
2b => 2b
2c => 2c
2d => 2d
2e => 2e
2f => 2f
30 => 30
31 => 31
32 => 32
33 => 33
34 => 34
35 => 35
36 => 36
37 => 37
38 => 38
39 => 39
3a => 3a
3b => 3b
3c => 3c
3d => 3d
3e => 3e
3f => 3f
40 => 40
41 => 61
42 => 62
43 => 63
44 => 64
45 => 65
46 => 66
47 => 67
48 => 68
49 => 69
4a => 6a
4b => 6b
4c => 6c
4d => 6d
4e => 6e
4f => 6f
50 => 70
51 => 71
52 => 72
53 => 73
54 => 74
55 => 75
56 => 76
57 => 77
58 => 78
59 => 79
5a => 7a
5b => 5b
5c => 5c
5d => 5d
5e => 5e
5f => 5f
60 => 60
61 => 61
62 => 62
63 => 63
64 => 64
65 => 65
66 => 66
67 => 67
68 => 68
69 => 69
6a => 6a
6b => 6b
6c => 6c
6d => 6d
6e => 6e
6f => 6f
70 => 70
71 => 71
72 => 72
73 => 73
74 => 74
75 => 75
76 => 76
77 => 77
78 => 78
79 => 79
7a => 7a
7b => 7b
7c => 7c
7d => 7d
7e => 7e
7f => 7f
80 => 80
81 => 81
82 => 82
83 => 83
84 => 84
85 => 85
86 => 86
87 => 87
88 => 88
89 => 89
8a => 8a
8b => 8b
8c => 8c
8d => 8d
8e => 8e
8f => 8f
90 => 90
91 => 91
92 => 92
93 => 93
94 => 94
95 => 95
96 => 96
97 => 97
98 => 98
99 => 99
9a => 9a
9b => 9b
9c => 9c
9d => 9d
9e => 9e
9f => 9f
a0 => a0
a1 => a1
a2 => a2
a3 => a3
a4 => a4
a5 => a5
a6 => a6
a7 => a7
a8 => a8
a9 => a9
aa => aa
ab => ab
ac => ac
ad => ad
ae => ae
af => af
b0 => b0
b1 => b1
b2 => b2
b3 => b3
b4 => b4
b5 => b5
b6 => b6
b7 => b7
b8 => b8
b9 => b9
ba => ba
bb => bb
bc => bc
bd => bd
be => be
bf => bf
c0 => c0
c1 => c1
c2 => c2
c3 => c3
c4 => c4
c5 => c5
c6 => c6
c7 => c7
c8 => c8
c9 => c9
ca => ca
cb => cb
cc => cc
cd => cd
ce => ce
cf => cf
d0 => d0
d1 => d1
d2 => d2
d3 => d3
d4 => d4
d5 => d5
d6 => d6
d7 => d7
d8 => d8
d9 => d9
da => da
db => db
dc => dc
dd => dd
de => de
df => df
e0 => e0
e1 => e1
e2 => e2
e3 => e3
e4 => e4
e5 => e5
e6 => e6
e7 => e7
e8 => e8
e9 => e9
ea => ea
eb => eb
ec => ec
ed => ed
ee => ee
ef => ef
f0 => f0
f1 => f1
f2 => f2
f3 => f3
f4 => f4
f5 => f5
f6 => f6
f7 => f7
f8 => f8
f9 => f9
fa => fa
fb => fb
fc => fc
fd => fd
fe => fe
ff => ff
*** Testing strlower() with basic strings ***
string(43) "mary had a little lamb and she loved it so
"
*** Testing strtolower() with various strings ***
-- Iteration 0 --
string(0) ""
-- Iteration 1 --
string(6) "string"
-- Iteration 2 --
string(10) "string0234"
-- Iteration 3 --
string(20) "1.233.344string12333"
-- Iteration 4 --
string(31) "$$$$$$!!!!@@@@@@@ abcdef !!!***"
-- Iteration 5 --
string(13) "abcd%0abcdabcd"
-- Iteration 6 --
string(1) "1"
-- Iteration 7 --
string(0) ""
-- Iteration 8 --
string(20) "aaaaaaaaaaaaaaaaaaaa"
-- Iteration 9 --
string(20) "zzzzzzzzzzzzzzzzzzzz"
-- Iteration 10 --
string(20) "@@@@@@@@@@@@@@@@@@@@"
-- Iteration 11 --
string(20) "[[[[[[[[[[[[[[[[[[[["
-- Iteration 12 --
string(62) "abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz"
*** Testing strtolower() with two different case strings ***
strings are same, with Case Insensitive
*** Done ***