@@ -12,6 +12,14 @@ import Foundation
12
12
let str = " abcdefg \u{A758} hijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz \u{A759} "
13
13
let str2 = " abcdefg \u{A759} hijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz \u{A758} "
14
14
15
+
16
+ @inline ( never)
17
+ func getMemoryUsage( ) -> Int {
18
+ var usage = rusage ( )
19
+ getrusage ( RUSAGE_SELF, & usage)
20
+ return usage. ru_maxrss
21
+ }
22
+
15
23
@inline ( never)
16
24
func lookup( _ str: String , _ dict: [ String : Int ] ) -> Bool {
17
25
if let _ = dict [ str] {
@@ -30,35 +38,44 @@ func lowercase(_ str: String) -> String {
30
38
return str. lowercased ( )
31
39
}
32
40
41
+ @inline ( never)
42
+ func runTest( ) {
43
+ for _ in 0 ..< 10_0000 {
44
+ if lookup ( " \u{1F1E7} \u{1F1E7} " , dict) {
45
+ print ( " Found?! " )
46
+ }
47
+ if uppercase ( str) == " A " {
48
+ print ( " Found?! " )
49
+ }
50
+ if lowercase ( str2) == " A " {
51
+ print ( " Found?! " )
52
+ }
53
+ }
54
+ }
55
+
56
+
33
57
/// Make sure the hash function does not leak.
34
58
35
59
let dict = [ " foo " : 1 ]
36
- for _ in 0 ..< 10_000_000 {
37
- if lookup ( " \u{1F1E7} \u{1F1E7} " , dict) {
38
- print ( " Found?! " )
39
- }
40
- if uppercase ( str) == " A " {
41
- print ( " Found?! " )
42
- }
43
- if lowercase ( str2) == " A " {
44
- print ( " Found?! " )
45
- }
46
- }
60
+
61
+ let baseUsage = getMemoryUsage ( )
62
+ runTest ( )
63
+ let firstRun = getMemoryUsage ( ) - baseUsage
64
+ runTest ( )
65
+ runTest ( )
66
+ let secondRun = getMemoryUsage ( ) - baseUsage
47
67
48
68
// CHECK-NOT: Found?!
49
69
// CHECK: Not found
50
70
51
71
print ( " Not found " )
52
72
53
- var usage = rusage ( )
54
- getrusage ( RUSAGE_SELF, & usage)
55
-
56
73
// CHECK: success
57
74
// CHECK-NOT: failure
58
75
59
76
// We should not need 50MB for this.
60
- if usage . ru_maxrss > 50 * 1024 * 1024 {
61
- print ( " failure - should not need 50MB! " )
77
+ if firstRun * 2 < secondRun {
78
+ print ( " failure - should not linearly increase " )
62
79
} else {
63
80
print ( " success " )
64
81
}
0 commit comments