Hi-
This is on Glass 1.0.beta9.1 and Gemstone 3.1.0.4 using GemTools 1.0.b71. as the client. Seems like its spending time looking up random numbers using file accesses on the client. [1000 timesRepeat:[UUID new]] timeToRun On my laptop in pharo this takes 14ms and in gemstone it takes 1920 ms Is there a way to get it to use the server as I thought that was much faster? Or is there a setting I need to fiddle with? Thanks Paul Here is the output from: ProfMonitor monitorBlock:[1000 timesRepeat:[UUID new]] '================ STATISTICAL SAMPLING RESULTS elapsed CPU time: 12308 ms monitoring interval: 1.0 ms tally % class and method name ------ ----- -------------------------------------- 2298 18.69 GsFile >> userAction:onClient: 1258 10.23 HostRandom >> integer 1111 9.04 SmallInteger >> bitShift: 944 7.68 GsFile >> next 914 7.43 Character >> asciiValue 906 7.37 GsFile >> nextByte 302 2.46 SymbolDictionary >> associationAt:otherwise: 288 2.34 SmallInteger >> > 281 2.29 System class >> __sessionStateAt: 280 2.28 Integer >> * 276 2.24 Semaphore >> _exitCritical 260 2.11 HostRandom >> file 258 2.10 GsFile >> isOpen 218 1.77 SessionTemps class >> current 217 1.77 Semaphore >> critical: 216 1.76 SymbolDictionary >> at:otherwise: 196 1.59 Float >> * 168 1.37 Float >> + 157 1.28 SmallInteger >> < 147 1.20 block in UUIDGenerator >> generateOneOrZero 137 1.11 block in Semaphore >> critical: 129 1.05 UUIDGenerator >> generateOneOrZero 126 1.02 Random >> float 125 1.02 Random >> next 124 1.01 Float >> < 124 1.01 Integer >> asFloat 119 0.97 SmallInteger >> bitOr: 114 0.93 UUIDGenerator >> generateRandomBitsOfLength: 113 0.92 Number >> _retry:coercing: 111 0.90 Semaphore >> wait 111 0.90 Object >> size 110 0.89 Semaphore >> signal 103 0.84 Float >> _coerce: 20 0.16 Object >> at:put: 9 0.07 UUIDGenerator >> placeFields: 3 0.02 SymbolDictionary >> at:ifAbsent: 3 0.02 UUID class >> new 2 0.02 Symbol >> = 2 0.02 MCPlatformSupport class >> transientGlobals 2 0.02 Dictionary >> associationAt:otherwise: 2 0.02 UUID >> initialize 1 0.01 AbstractDictionary >> _at: 1 0.01 String >> hash 1 0.01 Dictionary >> at:ifAbsent: 1 0.01 AbstractDictionary >> hashFunction: 1 0.01 SmallInteger >> \\ 1 0.01 block in executed code 1 0.01 UUID >> primMakeUUID 1 0.01 UUIDGenerator >> generateBytes:forVersion: 1 0.01 UUIDGenerator >> generateFieldsVersion4 1 0.01 System class >> _readClock 0 0.00 9 other methods 12294 100.00 Total ================ STATISTICAL STACK SAMPLING RESULTS elapsed CPU time: 12308 ms monitoring interval: 1.0 ms total % class and method name ------ ----- -------------------------------------- 12265 99.76 UUIDGenerator >> generateBytes:forVersion: 12220 99.40 UUIDGenerator >> generateFieldsVersion4 12217 99.37 UUIDGenerator >> generateRandomBitsOfLength: 11873 96.58 UUIDGenerator >> generateOneOrZero 11744 95.53 Semaphore >> critical: 11193 91.04 ExecBlock >> ensure: 10682 86.89 block in UUIDGenerator >> generateOneOrZero 10223 83.15 Random >> next 10098 82.14 Random >> float 8831 71.83 HostRandom >> integer 6541 53.20 UUID >> primMakeUUID 4546 36.98 GsFile >> nextByte 2726 22.17 GsFile >> next 2317 18.85 UUID >> initialize 2298 18.69 GsFile >> userAction:onClient: 1383 11.25 UUID class >> new 1270 10.33 HostRandom >> file 1111 9.04 SmallInteger >> bitShift: 973 7.91 Integer >> * 914 7.43 Character >> asciiValue 774 6.30 GsFile >> isOpen 758 6.17 block in executed code 693 5.64 Number >> _retry:coercing: 518 4.21 SymbolDictionary >> at:otherwise: 511 4.16 block in Semaphore >> critical: 499 4.06 SessionTemps class >> current 374 3.04 Semaphore >> signal 334 2.72 Semaphore >> wait 302 2.46 SymbolDictionary >> associationAt:otherwise: 288 2.34 SmallInteger >> > 281 2.29 System class >> __sessionStateAt: 276 2.24 Semaphore >> _exitCritical 227 1.85 Float >> _coerce: 196 1.59 Float >> * 171 1.39 ProfMonitor >> monitorBlock: 168 1.37 Float >> + 157 1.28 SmallInteger >> < 124 1.01 Float >> < 124 1.01 Integer >> asFloat 119 0.97 SmallInteger >> bitOr: 111 0.90 Object >> size 44 0.36 UUIDGenerator >> placeFields: 21 0.17 UUIDGenerator class >> default 21 0.17 MCPlatformSupport class >> transientGlobalForKey: 20 0.16 Object >> at:put: 12 0.10 MCPlatformSupport class >> transientGlobalNamed: 9 0.07 MCPlatformSupport class >> transientGlobals 9 0.07 Dictionary >> at:ifAbsent: 9 0.07 ProfMonitor class >> monitorBlock: 8 0.07 Dictionary >> associationAt:otherwise: 7 0.06 executed code 3 0.02 SymbolDictionary >> at:ifAbsent: 3 0.02 AbstractDictionary >> hashFunction: 2 0.02 Symbol >> = 1 0.01 AbstractDictionary >> _at: 1 0.01 String >> evaluateInContext:symbolList: 1 0.01 String >> hash 1 0.01 SmallInteger >> \\ 1 0.01 System class >> _readClock 1 0.01 ProfMonitor >> startMonitoring 12294 100.00 Total ================ STATISTICAL METHOD SENDERS RESULTS elapsed CPU time: 12308 ms monitoring interval: 1.0 ms % % Parent self total total local Method Time Time ms % Child ------ ------ ------ ----- ----------- 6526.4 53.2 UUID >> primMakeUUID = 0.0 99.8 12279.0 0.0 UUIDGenerator >> generateBytes:forVersion: 44.1 0.4 UUIDGenerator >> placeFields: 12233.9 99.6 UUIDGenerator >> generateFieldsVersion4 ----------------------------------------------------- 12233.9 100.0 UUIDGenerator >> generateBytes:forVersion: = 0.0 99.4 12233.9 0.0 UUIDGenerator >> generateFieldsVersion4 2.0 0.0 SmallInteger >> bitOr: 12230.9 100.0 UUIDGenerator >> generateRandomBitsOfLength: ----------------------------------------------------- 12230.9 100.0 UUIDGenerator >> generateFieldsVersion4 = 0.9 99.4 12230.9 0.9 UUIDGenerator >> generateRandomBitsOfLength: 117.1 1.0 SmallInteger >> bitOr: 113.1 0.9 SmallInteger >> bitShift: 11886.5 97.2 UUIDGenerator >> generateOneOrZero ----------------------------------------------------- 11886.5 100.0 UUIDGenerator >> generateRandomBitsOfLength: = 1.0 96.6 11886.5 1.1 UUIDGenerator >> generateOneOrZero 11757.4 98.9 Semaphore >> critical: ----------------------------------------------------- 11757.4 100.0 UUIDGenerator >> generateOneOrZero = 1.8 95.5 11757.4 1.8 Semaphore >> critical: 334.4 2.8 Semaphore >> wait 11205.7 95.3 ExecBlock >> ensure: ----------------------------------------------------- 11205.7 100.0 Semaphore >> critical: = 0.0 91.0 11205.7 0.0 ExecBlock >> ensure: 511.6 4.6 block in Semaphore >> critical: 10694.2 95.4 block in UUIDGenerator >> generateOneOrZero ----------------------------------------------------- 10694.2 100.0 ExecBlock >> ensure: = 1.2 86.9 10694.2 1.4 block in UUIDGenerator >> generateOneOrZero 124.1 1.2 Float >> < 188.2 1.8 SmallInteger >> > 10234.6 95.7 Random >> next ----------------------------------------------------- 10234.6 100.0 block in UUIDGenerator >> generateOneOrZero = 1.0 83.2 10234.6 1.2 Random >> next 10109.5 98.8 Random >> float ----------------------------------------------------- 10109.5 100.0 Random >> next = 1.0 82.1 10109.5 1.2 Random >> float 974.1 9.6 Integer >> * 168.2 1.7 Float >> + 8841.1 87.5 HostRandom >> integer ----------------------------------------------------- 8841.1 100.0 Random >> float = 10.2 71.8 8841.1 14.2 HostRandom >> integer 774.9 8.8 GsFile >> isOpen 984.1 11.1 SmallInteger >> bitShift: 4551.2 51.5 GsFile >> nextByte 1271.4 14.4 HostRandom >> file ----------------------------------------------------- 2317.6 35.4 UUID >> initialize = 0.0 53.2 6548.4 0.0 UUID >> primMakeUUID 21.0 0.3 UUIDGenerator class >> default 6526.4 99.7 UUIDGenerator >> generateBytes:forVersion: ----------------------------------------------------- 4551.2 100.0 HostRandom >> integer = 7.4 37.0 4551.2 19.9 GsFile >> nextByte 915.0 20.1 Character >> asciiValue 2729.1 60.0 GsFile >> next ----------------------------------------------------- 2729.1 100.0 GsFile >> nextByte = 7.7 22.2 2729.1 34.6 GsFile >> next 1784.0 65.4 GsFile >> userAction:onClient: ----------------------------------------------------- 1381.6 59.6 UUID class >> new = 0.0 18.8 2319.6 0.1 UUID >> initialize 2317.6 99.9 UUID >> primMakeUUID ----------------------------------------------------- 1784.0 77.5 GsFile >> next 516.6 22.5 GsFile >> isOpen = 18.7 18.7 2300.6 100.0 GsFile >> userAction:onClient: ----------------------------------------------------- 757.9 54.7 block in executed code = 0.0 11.2 1384.6 0.2 UUID class >> new 1381.6 99.8 UUID >> initialize ----------------------------------------------------- 1271.4 100.0 HostRandom >> integer = 2.1 10.3 1271.4 20.5 HostRandom >> file 492.6 38.7 SessionTemps class >> current 518.6 40.8 SymbolDictionary >> at:otherwise: ----------------------------------------------------- 15.0 1.4 UUIDGenerator >> placeFields: 113.1 10.2 UUIDGenerator >> generateRandomBitsOfLength: 984.1 88.5 HostRandom >> integer = 9.0 9.0 1112.3 100.0 SmallInteger >> bitShift: ----------------------------------------------------- 974.1 100.0 Random >> float = 2.3 7.9 974.1 28.8 Integer >> * 693.8 71.2 Number >> _retry:coercing: ----------------------------------------------------- 915.0 100.0 GsFile >> nextByte = 7.4 7.4 915.0 100.0 Character >> asciiValue ----------------------------------------------------- 774.9 100.0 HostRandom >> integer = 2.1 6.3 774.9 33.3 GsFile >> isOpen 516.6 66.7 GsFile >> userAction:onClient: ----------------------------------------------------- 170.2 22.4 ProfMonitor >> monitorBlock: = 0.0 6.2 758.9 0.1 block in executed code 757.9 99.9 UUID class >> new ----------------------------------------------------- 693.8 100.0 Integer >> * = 0.9 5.6 693.8 16.3 Number >> _retry:coercing: 196.2 28.3 Float >> * 227.3 32.8 Float >> _coerce: 157.2 22.7 SmallInteger >> < ----------------------------------------------------- 518.6 100.0 HostRandom >> file = 1.8 4.2 518.6 41.7 SymbolDictionary >> at:otherwise: 302.3 58.3 SymbolDictionary >> associationAt:otherwise: ----------------------------------------------------- 511.6 100.0 ExecBlock >> ensure: = 1.1 4.2 511.6 26.8 block in Semaphore >> critical: 374.4 73.2 Semaphore >> signal ----------------------------------------------------- 492.6 98.6 HostRandom >> file 7.0 1.4 MCPlatformSupport class >> transientGlobals = 1.8 4.1 499.6 43.7 SessionTemps class >> current 281.3 56.3 System class >> __sessionStateAt: ----------------------------------------------------- 374.4 100.0 block in Semaphore >> critical: = 0.9 3.0 374.4 29.4 Semaphore >> signal 153.2 40.9 Semaphore >> _exitCritical 111.1 29.7 Object >> size ----------------------------------------------------- 334.4 100.0 Semaphore >> critical: = 0.9 2.7 334.4 33.2 Semaphore >> wait 100.1 29.9 SmallInteger >> > 123.1 36.8 Semaphore >> _exitCritical ----------------------------------------------------- 302.3 100.0 SymbolDictionary >> at:otherwise: = 2.5 2.5 302.3 100.0 SymbolDictionary >> associationAt:otherwise: ----------------------------------------------------- 100.1 34.7 Semaphore >> wait 188.2 65.3 block in UUIDGenerator >> generateOneOrZero = 2.3 2.3 288.3 100.0 SmallInteger >> > ----------------------------------------------------- 281.3 100.0 SessionTemps class >> current = 2.3 2.3 281.3 100.0 System class >> __sessionStateAt: ----------------------------------------------------- 123.1 44.6 Semaphore >> wait 153.2 55.4 Semaphore >> signal = 2.2 2.2 276.3 100.0 Semaphore >> _exitCritical ----------------------------------------------------- 227.3 100.0 Number >> _retry:coercing: = 0.8 1.8 227.3 45.4 Float >> _coerce: 124.1 54.6 Integer >> asFloat ----------------------------------------------------- 196.2 100.0 Number >> _retry:coercing: = 1.6 1.6 196.2 100.0 Float >> * ----------------------------------------------------- 9.0 5.3 ProfMonitor class >> monitorBlock: = 0.0 1.4 171.2 0.0 ProfMonitor >> monitorBlock: 170.2 99.4 block in executed code 1.0 0.6 ProfMonitor >> startMonitoring ----------------------------------------------------- 168.2 100.0 Random >> float = 1.4 1.4 168.2 100.0 Float >> + ----------------------------------------------------- 157.2 100.0 Number >> _retry:coercing: = 1.3 1.3 157.2 100.0 SmallInteger >> < ----------------------------------------------------- 124.1 100.0 block in UUIDGenerator >> generateOneOrZero = 1.0 1.0 124.1 100.0 Float >> < ----------------------------------------------------- 124.1 100.0 Float >> _coerce: = 1.0 1.0 124.1 100.0 Integer >> asFloat ----------------------------------------------------- 2.0 1.7 UUIDGenerator >> generateFieldsVersion4 117.1 98.3 UUIDGenerator >> generateRandomBitsOfLength: = 1.0 1.0 119.1 100.0 SmallInteger >> bitOr: ----------------------------------------------------- 111.1 100.0 Semaphore >> signal = 0.9 0.9 111.1 100.0 Object >> size ----------------------------------------------------- 44.1 100.0 UUIDGenerator >> generateBytes:forVersion: = 0.1 0.4 44.1 20.5 UUIDGenerator >> placeFields: 20.0 45.5 Object >> at:put: 15.0 34.1 SmallInteger >> bitShift: ----------------------------------------------------- 21.0 100.0 UUID >> primMakeUUID = 0.0 0.2 21.0 0.0 UUIDGenerator class >> default 21.0 100.0 MCPlatformSupport class >> transientGlobalForKey: ----------------------------------------------------- 21.0 100.0 UUIDGenerator class >> default = 0.0 0.2 21.0 0.0 MCPlatformSupport class >> transientGlobalForKey: 12.0 57.1 MCPlatformSupport class >> transientGlobalNamed: 9.0 42.9 Dictionary >> at:ifAbsent: ----------------------------------------------------- 20.0 100.0 UUIDGenerator >> placeFields: = 0.2 0.2 20.0 100.0 Object >> at:put: ----------------------------------------------------- 12.0 100.0 MCPlatformSupport class >> transientGlobalForKey: = 0.0 0.1 12.0 0.0 MCPlatformSupport class >> transientGlobalNamed: 3.0 25.0 SymbolDictionary >> at:ifAbsent: 9.0 75.0 MCPlatformSupport class >> transientGlobals ----------------------------------------------------- 9.0 100.0 MCPlatformSupport class >> transientGlobalNamed: = 0.0 0.1 9.0 22.2 MCPlatformSupport class >> transientGlobals 7.0 77.8 SessionTemps class >> current ----------------------------------------------------- 9.0 100.0 MCPlatformSupport class >> transientGlobalForKey: = 0.0 0.1 9.0 11.1 Dictionary >> at:ifAbsent: 8.0 88.9 Dictionary >> associationAt:otherwise: ----------------------------------------------------- 7.0 77.8 executed code = 0.0 0.1 9.0 0.0 ProfMonitor class >> monitorBlock: 9.0 100.0 ProfMonitor >> monitorBlock: ----------------------------------------------------- 8.0 100.0 Dictionary >> at:ifAbsent: = 0.0 0.1 8.0 25.0 Dictionary >> associationAt:otherwise: 1.0 12.5 AbstractDictionary >> _at: 2.0 25.0 Symbol >> = 3.0 37.5 AbstractDictionary >> hashFunction: ----------------------------------------------------- 1.0 14.3 String >> evaluateInContext:symbolList: = 0.0 0.1 7.0 0.0 executed code 7.0 100.0 ProfMonitor class >> monitorBlock: ----------------------------------------------------- 3.0 100.0 MCPlatformSupport class >> transientGlobalNamed: = 0.0 0.0 3.0 100.0 SymbolDictionary >> at:ifAbsent: ----------------------------------------------------- 3.0 100.0 Dictionary >> associationAt:otherwise: = 0.0 0.0 3.0 33.3 AbstractDictionary >> hashFunction: 1.0 33.3 String >> hash 1.0 33.3 SmallInteger >> \\ ----------------------------------------------------- 2.0 100.0 Dictionary >> associationAt:otherwise: = 0.0 0.0 2.0 100.0 Symbol >> = ----------------------------------------------------- 1.0 100.0 Dictionary >> associationAt:otherwise: = 0.0 0.0 1.0 100.0 AbstractDictionary >> _at: ----------------------------------------------------- = 0.0 0.0 1.0 0.0 String >> evaluateInContext:symbolList: 1.0 100.0 executed code ----------------------------------------------------- 1.0 100.0 AbstractDictionary >> hashFunction: = 0.0 0.0 1.0 100.0 String >> hash ----------------------------------------------------- 1.0 100.0 AbstractDictionary >> hashFunction: = 0.0 0.0 1.0 100.0 SmallInteger >> \\ ----------------------------------------------------- 1.0 100.0 ProfMonitor >> startMonitoring = 0.0 0.0 1.0 100.0 System class >> _readClock ----------------------------------------------------- 1.0 100.0 ProfMonitor >> monitorBlock: = 0.0 0.0 1.0 0.0 ProfMonitor >> startMonitoring 1.0 100.0 System class >> _readClock ----------------------------------------------------- ' _______________________________________________ Glass mailing list [hidden email] http://lists.gemtalksystems.com/mailman/listinfo/glass |
Paul,
First the call to userAction:onClient: does not imply that the operation is being done on the client. HostRandom operates against /dev/urandom on the server side so the cost you are seeing is likely just the overhead of accessing the file. On my laptop the expression [1000 timesRepeat:[UUID new]] timeToRun takes 800ms using HostRandom and 400ms using Lag25000CmwcRandom (not file-based although HostRandom is used to define initial seed) ... Still, there is a fair amount of Smalltalk code being executed here so a primitive call (which is what pharo does) would be the way to speed this up ... I'll look into this for 3.2...(or at least making random number generation a lot faster)... Dale | From: "Paul DeBruicker" <[hidden email]> | To: [hidden email] | Sent: Tuesday, September 17, 2013 6:43:46 PM | Subject: [Glass] UUID new >100x slower than Pharo? | | Hi- | | This is on Glass 1.0.beta9.1 and Gemstone 3.1.0.4 using GemTools | 1.0.b71. as the client. | | Seems like its spending time looking up random numbers using file | accesses on the client. | | [1000 timesRepeat:[UUID new]] timeToRun | | On my laptop in pharo this takes 14ms and in gemstone it takes 1920 | ms | | | Is there a way to get it to use the server as I thought that was much | faster? | | Or is there a setting I need to fiddle with? | | Thanks | | Paul | | | | Here is the output from: | | ProfMonitor monitorBlock:[1000 timesRepeat:[UUID new]] | | | | '================ | STATISTICAL SAMPLING RESULTS | elapsed CPU time: 12308 ms | monitoring interval: 1.0 ms | | tally % class and method name | ------ ----- -------------------------------------- | 2298 18.69 GsFile >> userAction:onClient: | 1258 10.23 HostRandom >> integer | 1111 9.04 SmallInteger >> bitShift: | 944 7.68 GsFile >> next | 914 7.43 Character >> asciiValue | 906 7.37 GsFile >> nextByte | 302 2.46 SymbolDictionary >> | associationAt:otherwise: | 288 2.34 SmallInteger >> > | 281 2.29 System class >> __sessionStateAt: | 280 2.28 Integer >> * | 276 2.24 Semaphore >> _exitCritical | 260 2.11 HostRandom >> file | 258 2.10 GsFile >> isOpen | 218 1.77 SessionTemps class >> current | 217 1.77 Semaphore >> critical: | 216 1.76 SymbolDictionary >> at:otherwise: | 196 1.59 Float >> * | 168 1.37 Float >> + | 157 1.28 SmallInteger >> < | 147 1.20 block in UUIDGenerator >> generateOneOrZero | 137 1.11 block in Semaphore >> critical: | 129 1.05 UUIDGenerator >> generateOneOrZero | 126 1.02 Random >> float | 125 1.02 Random >> next | 124 1.01 Float >> < | 124 1.01 Integer >> asFloat | 119 0.97 SmallInteger >> bitOr: | 114 0.93 UUIDGenerator >> | generateRandomBitsOfLength: | 113 0.92 Number >> _retry:coercing: | 111 0.90 Semaphore >> wait | 111 0.90 Object >> size | 110 0.89 Semaphore >> signal | 103 0.84 Float >> _coerce: | 20 0.16 Object >> at:put: | 9 0.07 UUIDGenerator >> placeFields: | 3 0.02 SymbolDictionary >> at:ifAbsent: | 3 0.02 UUID class >> new | 2 0.02 Symbol >> = | 2 0.02 MCPlatformSupport class >> transientGlobals | 2 0.02 Dictionary >> | associationAt:otherwise: | 2 0.02 UUID >> initialize | 1 0.01 AbstractDictionary >> _at: | 1 0.01 String >> hash | 1 0.01 Dictionary >> at:ifAbsent: | 1 0.01 AbstractDictionary >> hashFunction: | 1 0.01 SmallInteger >> \\ | 1 0.01 block in executed code | 1 0.01 UUID >> primMakeUUID | 1 0.01 UUIDGenerator >> | generateBytes:forVersion: | 1 0.01 UUIDGenerator >> generateFieldsVersion4 | 1 0.01 System class >> _readClock | 0 0.00 9 other methods | 12294 100.00 Total | | | ================ | STATISTICAL STACK SAMPLING RESULTS | elapsed CPU time: 12308 ms | monitoring interval: 1.0 ms | | total % class and method name | ------ ----- -------------------------------------- | 12265 99.76 UUIDGenerator >> | generateBytes:forVersion: | 12220 99.40 UUIDGenerator >> generateFieldsVersion4 | 12217 99.37 UUIDGenerator >> | generateRandomBitsOfLength: | 11873 96.58 UUIDGenerator >> generateOneOrZero | 11744 95.53 Semaphore >> critical: | 11193 91.04 ExecBlock >> ensure: | 10682 86.89 block in UUIDGenerator >> generateOneOrZero | 10223 83.15 Random >> next | 10098 82.14 Random >> float | 8831 71.83 HostRandom >> integer | 6541 53.20 UUID >> primMakeUUID | 4546 36.98 GsFile >> nextByte | 2726 22.17 GsFile >> next | 2317 18.85 UUID >> initialize | 2298 18.69 GsFile >> userAction:onClient: | 1383 11.25 UUID class >> new | 1270 10.33 HostRandom >> file | 1111 9.04 SmallInteger >> bitShift: | 973 7.91 Integer >> * | 914 7.43 Character >> asciiValue | 774 6.30 GsFile >> isOpen | 758 6.17 block in executed code | 693 5.64 Number >> _retry:coercing: | 518 4.21 SymbolDictionary >> at:otherwise: | 511 4.16 block in Semaphore >> critical: | 499 4.06 SessionTemps class >> current | 374 3.04 Semaphore >> signal | 334 2.72 Semaphore >> wait | 302 2.46 SymbolDictionary >> | associationAt:otherwise: | 288 2.34 SmallInteger >> > | 281 2.29 System class >> __sessionStateAt: | 276 2.24 Semaphore >> _exitCritical | 227 1.85 Float >> _coerce: | 196 1.59 Float >> * | 171 1.39 ProfMonitor >> monitorBlock: | 168 1.37 Float >> + | 157 1.28 SmallInteger >> < | 124 1.01 Float >> < | 124 1.01 Integer >> asFloat | 119 0.97 SmallInteger >> bitOr: | 111 0.90 Object >> size | 44 0.36 UUIDGenerator >> placeFields: | 21 0.17 UUIDGenerator class >> default | 21 0.17 MCPlatformSupport class >> transientGlobalForKey: | 20 0.16 Object >> at:put: | 12 0.10 MCPlatformSupport class >> transientGlobalNamed: | 9 0.07 MCPlatformSupport class >> transientGlobals | 9 0.07 Dictionary >> at:ifAbsent: | 9 0.07 ProfMonitor class >> monitorBlock: | 8 0.07 Dictionary >> | associationAt:otherwise: | 7 0.06 executed code | 3 0.02 SymbolDictionary >> at:ifAbsent: | 3 0.02 AbstractDictionary >> hashFunction: | 2 0.02 Symbol >> = | 1 0.01 AbstractDictionary >> _at: | 1 0.01 String >> | evaluateInContext:symbolList: | 1 0.01 String >> hash | 1 0.01 SmallInteger >> \\ | 1 0.01 System class >> _readClock | 1 0.01 ProfMonitor >> startMonitoring | 12294 100.00 Total | | | ================ | STATISTICAL METHOD SENDERS RESULTS | elapsed CPU time: 12308 ms | monitoring interval: 1.0 ms | | % % Parent | self total total local Method | Time Time ms % Child | ------ ------ ------ ----- ----------- | | 6526.4 53.2 UUID >> primMakeUUID | = 0.0 99.8 12279.0 0.0 UUIDGenerator >> | generateBytes:forVersion: | 44.1 0.4 UUIDGenerator >> placeFields: | 12233.9 99.6 UUIDGenerator >> | generateFieldsVersion4 | ----------------------------------------------------- | | 12233.9 100.0 UUIDGenerator >> | generateBytes:forVersion: | = 0.0 99.4 12233.9 0.0 UUIDGenerator >> | generateFieldsVersion4 | 2.0 0.0 SmallInteger >> bitOr: | 12230.9 100.0 UUIDGenerator >> | generateRandomBitsOfLength: | ----------------------------------------------------- | | 12230.9 100.0 UUIDGenerator >> | generateFieldsVersion4 | = 0.9 99.4 12230.9 0.9 UUIDGenerator >> | generateRandomBitsOfLength: | 117.1 1.0 SmallInteger >> bitOr: | 113.1 0.9 SmallInteger >> bitShift: | 11886.5 97.2 UUIDGenerator >> | generateOneOrZero | ----------------------------------------------------- | | 11886.5 100.0 UUIDGenerator >> | generateRandomBitsOfLength: | = 1.0 96.6 11886.5 1.1 UUIDGenerator >> generateOneOrZero | 11757.4 98.9 Semaphore >> critical: | ----------------------------------------------------- | | 11757.4 100.0 UUIDGenerator >> | generateOneOrZero | = 1.8 95.5 11757.4 1.8 Semaphore >> critical: | 334.4 2.8 Semaphore >> wait | 11205.7 95.3 ExecBlock >> ensure: | ----------------------------------------------------- | | 11205.7 100.0 Semaphore >> critical: | = 0.0 91.0 11205.7 0.0 ExecBlock >> ensure: | 511.6 4.6 block in Semaphore >> critical: | 10694.2 95.4 block in UUIDGenerator >> | generateOneOrZero | ----------------------------------------------------- | | 10694.2 100.0 ExecBlock >> ensure: | = 1.2 86.9 10694.2 1.4 block in UUIDGenerator >> | generateOneOrZero | 124.1 1.2 Float >> < | 188.2 1.8 SmallInteger >> > | 10234.6 95.7 Random >> next | ----------------------------------------------------- | | 10234.6 100.0 block in UUIDGenerator >> | generateOneOrZero | = 1.0 83.2 10234.6 1.2 Random >> next | 10109.5 98.8 Random >> float | ----------------------------------------------------- | | 10109.5 100.0 Random >> next | = 1.0 82.1 10109.5 1.2 Random >> float | 974.1 9.6 Integer >> * | 168.2 1.7 Float >> + | 8841.1 87.5 HostRandom >> integer | ----------------------------------------------------- | | 8841.1 100.0 Random >> float | = 10.2 71.8 8841.1 14.2 HostRandom >> integer | 774.9 8.8 GsFile >> isOpen | 984.1 11.1 SmallInteger >> bitShift: | 4551.2 51.5 GsFile >> nextByte | 1271.4 14.4 HostRandom >> file | ----------------------------------------------------- | | 2317.6 35.4 UUID >> initialize | = 0.0 53.2 6548.4 0.0 UUID >> primMakeUUID | 21.0 0.3 UUIDGenerator class >> default | 6526.4 99.7 UUIDGenerator >> | generateBytes:forVersion: | ----------------------------------------------------- | | 4551.2 100.0 HostRandom >> integer | = 7.4 37.0 4551.2 19.9 GsFile >> nextByte | 915.0 20.1 Character >> asciiValue | 2729.1 60.0 GsFile >> next | ----------------------------------------------------- | | 2729.1 100.0 GsFile >> nextByte | = 7.7 22.2 2729.1 34.6 GsFile >> next | 1784.0 65.4 GsFile >> | userAction:onClient: | ----------------------------------------------------- | | 1381.6 59.6 UUID class >> new | = 0.0 18.8 2319.6 0.1 UUID >> initialize | 2317.6 99.9 UUID >> primMakeUUID | ----------------------------------------------------- | | 1784.0 77.5 GsFile >> next | 516.6 22.5 GsFile >> isOpen | = 18.7 18.7 2300.6 100.0 GsFile >> userAction:onClient: | ----------------------------------------------------- | | 757.9 54.7 block in executed code | = 0.0 11.2 1384.6 0.2 UUID class >> new | 1381.6 99.8 UUID >> initialize | ----------------------------------------------------- | | 1271.4 100.0 HostRandom >> integer | = 2.1 10.3 1271.4 20.5 HostRandom >> file | 492.6 38.7 SessionTemps class >> current | 518.6 40.8 SymbolDictionary >> | at:otherwise: | ----------------------------------------------------- | | 15.0 1.4 UUIDGenerator >> placeFields: | 113.1 10.2 UUIDGenerator >> | generateRandomBitsOfLength: | 984.1 88.5 HostRandom >> integer | = 9.0 9.0 1112.3 100.0 SmallInteger >> bitShift: | ----------------------------------------------------- | | 974.1 100.0 Random >> float | = 2.3 7.9 974.1 28.8 Integer >> * | 693.8 71.2 Number >> _retry:coercing: | ----------------------------------------------------- | | 915.0 100.0 GsFile >> nextByte | = 7.4 7.4 915.0 100.0 Character >> asciiValue | ----------------------------------------------------- | | 774.9 100.0 HostRandom >> integer | = 2.1 6.3 774.9 33.3 GsFile >> isOpen | 516.6 66.7 GsFile >> | userAction:onClient: | ----------------------------------------------------- | | 170.2 22.4 ProfMonitor >> monitorBlock: | = 0.0 6.2 758.9 0.1 block in executed code | 757.9 99.9 UUID class >> new | ----------------------------------------------------- | | 693.8 100.0 Integer >> * | = 0.9 5.6 693.8 16.3 Number >> _retry:coercing: | 196.2 28.3 Float >> * | 227.3 32.8 Float >> _coerce: | 157.2 22.7 SmallInteger >> < | ----------------------------------------------------- | | 518.6 100.0 HostRandom >> file | = 1.8 4.2 518.6 41.7 SymbolDictionary >> at:otherwise: | 302.3 58.3 SymbolDictionary >> | associationAt:otherwise: | ----------------------------------------------------- | | 511.6 100.0 ExecBlock >> ensure: | = 1.1 4.2 511.6 26.8 block in Semaphore >> critical: | 374.4 73.2 Semaphore >> signal | ----------------------------------------------------- | | 492.6 98.6 HostRandom >> file | 7.0 1.4 MCPlatformSupport class >> | transientGlobals | = 1.8 4.1 499.6 43.7 SessionTemps class >> current | 281.3 56.3 System class >> | __sessionStateAt: | ----------------------------------------------------- | | 374.4 100.0 block in Semaphore >> critical: | = 0.9 3.0 374.4 29.4 Semaphore >> signal | 153.2 40.9 Semaphore >> _exitCritical | 111.1 29.7 Object >> size | ----------------------------------------------------- | | 334.4 100.0 Semaphore >> critical: | = 0.9 2.7 334.4 33.2 Semaphore >> wait | 100.1 29.9 SmallInteger >> > | 123.1 36.8 Semaphore >> _exitCritical | ----------------------------------------------------- | | 302.3 100.0 SymbolDictionary >> | at:otherwise: | = 2.5 2.5 302.3 100.0 SymbolDictionary >> | associationAt:otherwise: | ----------------------------------------------------- | | 100.1 34.7 Semaphore >> wait | 188.2 65.3 block in UUIDGenerator >> | generateOneOrZero | = 2.3 2.3 288.3 100.0 SmallInteger >> > | ----------------------------------------------------- | | 281.3 100.0 SessionTemps class >> current | = 2.3 2.3 281.3 100.0 System class >> __sessionStateAt: | ----------------------------------------------------- | | 123.1 44.6 Semaphore >> wait | 153.2 55.4 Semaphore >> signal | = 2.2 2.2 276.3 100.0 Semaphore >> _exitCritical | ----------------------------------------------------- | | 227.3 100.0 Number >> _retry:coercing: | = 0.8 1.8 227.3 45.4 Float >> _coerce: | 124.1 54.6 Integer >> asFloat | ----------------------------------------------------- | | 196.2 100.0 Number >> _retry:coercing: | = 1.6 1.6 196.2 100.0 Float >> * | ----------------------------------------------------- | | 9.0 5.3 ProfMonitor class >> | monitorBlock: | = 0.0 1.4 171.2 0.0 ProfMonitor >> monitorBlock: | 170.2 99.4 block in executed code | 1.0 0.6 ProfMonitor >> startMonitoring | ----------------------------------------------------- | | 168.2 100.0 Random >> float | = 1.4 1.4 168.2 100.0 Float >> + | ----------------------------------------------------- | | 157.2 100.0 Number >> _retry:coercing: | = 1.3 1.3 157.2 100.0 SmallInteger >> < | ----------------------------------------------------- | | 124.1 100.0 block in UUIDGenerator >> | generateOneOrZero | = 1.0 1.0 124.1 100.0 Float >> < | ----------------------------------------------------- | | 124.1 100.0 Float >> _coerce: | = 1.0 1.0 124.1 100.0 Integer >> asFloat | ----------------------------------------------------- | | 2.0 1.7 UUIDGenerator >> | generateFieldsVersion4 | 117.1 98.3 UUIDGenerator >> | generateRandomBitsOfLength: | = 1.0 1.0 119.1 100.0 SmallInteger >> bitOr: | ----------------------------------------------------- | | 111.1 100.0 Semaphore >> signal | = 0.9 0.9 111.1 100.0 Object >> size | ----------------------------------------------------- | | 44.1 100.0 UUIDGenerator >> | generateBytes:forVersion: | = 0.1 0.4 44.1 20.5 UUIDGenerator >> placeFields: | 20.0 45.5 Object >> at:put: | 15.0 34.1 SmallInteger >> bitShift: | ----------------------------------------------------- | | 21.0 100.0 UUID >> primMakeUUID | = 0.0 0.2 21.0 0.0 UUIDGenerator class >> default | 21.0 100.0 MCPlatformSupport class >> | transientGlobalForKey: | ----------------------------------------------------- | | 21.0 100.0 UUIDGenerator class >> default | = 0.0 0.2 21.0 0.0 MCPlatformSupport class >> | transientGlobalForKey: | 12.0 57.1 MCPlatformSupport class >> | transientGlobalNamed: | 9.0 42.9 Dictionary >> at:ifAbsent: | ----------------------------------------------------- | | 20.0 100.0 UUIDGenerator >> placeFields: | = 0.2 0.2 20.0 100.0 Object >> at:put: | ----------------------------------------------------- | | 12.0 100.0 MCPlatformSupport class >> | transientGlobalForKey: | = 0.0 0.1 12.0 0.0 MCPlatformSupport class >> | transientGlobalNamed: | 3.0 25.0 SymbolDictionary >> at:ifAbsent: | 9.0 75.0 MCPlatformSupport class >> | transientGlobals | ----------------------------------------------------- | | 9.0 100.0 MCPlatformSupport class >> | transientGlobalNamed: | = 0.0 0.1 9.0 22.2 MCPlatformSupport class >> | transientGlobals | 7.0 77.8 SessionTemps class >> current | ----------------------------------------------------- | | 9.0 100.0 MCPlatformSupport class >> | transientGlobalForKey: | = 0.0 0.1 9.0 11.1 Dictionary >> at:ifAbsent: | 8.0 88.9 Dictionary >> | associationAt:otherwise: | ----------------------------------------------------- | | 7.0 77.8 executed code | = 0.0 0.1 9.0 0.0 ProfMonitor class >> monitorBlock: | 9.0 100.0 ProfMonitor >> monitorBlock: | ----------------------------------------------------- | | 8.0 100.0 Dictionary >> at:ifAbsent: | = 0.0 0.1 8.0 25.0 Dictionary >> | associationAt:otherwise: | 1.0 12.5 AbstractDictionary >> _at: | 2.0 25.0 Symbol >> = | 3.0 37.5 AbstractDictionary >> | hashFunction: | ----------------------------------------------------- | | 1.0 14.3 String >> | evaluateInContext:symbolList: | = 0.0 0.1 7.0 0.0 executed code | 7.0 100.0 ProfMonitor class >> | monitorBlock: | ----------------------------------------------------- | | 3.0 100.0 MCPlatformSupport class >> | transientGlobalNamed: | = 0.0 0.0 3.0 100.0 SymbolDictionary >> at:ifAbsent: | ----------------------------------------------------- | | 3.0 100.0 Dictionary >> | associationAt:otherwise: | = 0.0 0.0 3.0 33.3 AbstractDictionary >> hashFunction: | 1.0 33.3 String >> hash | 1.0 33.3 SmallInteger >> \\ | ----------------------------------------------------- | | 2.0 100.0 Dictionary >> | associationAt:otherwise: | = 0.0 0.0 2.0 100.0 Symbol >> = | ----------------------------------------------------- | | 1.0 100.0 Dictionary >> | associationAt:otherwise: | = 0.0 0.0 1.0 100.0 AbstractDictionary >> _at: | ----------------------------------------------------- | | = 0.0 0.0 1.0 0.0 String >> | evaluateInContext:symbolList: | 1.0 100.0 executed code | ----------------------------------------------------- | | 1.0 100.0 AbstractDictionary >> | hashFunction: | = 0.0 0.0 1.0 100.0 String >> hash | ----------------------------------------------------- | | 1.0 100.0 AbstractDictionary >> | hashFunction: | = 0.0 0.0 1.0 100.0 SmallInteger >> \\ | ----------------------------------------------------- | | 1.0 100.0 ProfMonitor >> startMonitoring | = 0.0 0.0 1.0 100.0 System class >> _readClock | ----------------------------------------------------- | | 1.0 100.0 ProfMonitor >> monitorBlock: | = 0.0 0.0 1.0 0.0 ProfMonitor >> startMonitoring | 1.0 100.0 System class >> _readClock | ----------------------------------------------------- | | | ' | | _______________________________________________ | Glass mailing list | [hidden email] | http://lists.gemtalksystems.com/mailman/listinfo/glass | _______________________________________________ Glass mailing list [hidden email] http://lists.gemtalksystems.com/mailman/listinfo/glass |
Thanks Dale,
Tobias Pape replied off list that I should just use the FFI library as Pharo is calling the libuuid on the platform anyway. So I'll work on that. Paul On 09/17/2013 10:44 AM, Dale K. Henrichs wrote: > Paul, > > First the call to userAction:onClient: does not imply that the operation is being done on the client. HostRandom operates against /dev/urandom on the server side so the cost you are seeing is likely just the overhead of accessing the file. > > On my laptop the expression > > [1000 timesRepeat:[UUID new]] timeToRun > > takes 800ms using HostRandom and 400ms using Lag25000CmwcRandom (not file-based although HostRandom is used to define initial seed) ... > > Still, there is a fair amount of Smalltalk code being executed here so a primitive call (which is what pharo does) would be the way to speed this up ... > > I'll look into this for 3.2...(or at least making random number generation a lot faster)... > > > Dale > > > | From: "Paul DeBruicker" <[hidden email]> > | To: [hidden email] > | Sent: Tuesday, September 17, 2013 6:43:46 PM > | Subject: [Glass] UUID new >100x slower than Pharo? > | > | Hi- > | > | This is on Glass 1.0.beta9.1 and Gemstone 3.1.0.4 using GemTools > | 1.0.b71. as the client. > | > | Seems like its spending time looking up random numbers using file > | accesses on the client. > | > | [1000 timesRepeat:[UUID new]] timeToRun > | > | On my laptop in pharo this takes 14ms and in gemstone it takes 1920 > | ms > | > | > | Is there a way to get it to use the server as I thought that was much > | faster? > | > | Or is there a setting I need to fiddle with? > | > | Thanks > | > | Paul > | > | > | > | Here is the output from: > | > | ProfMonitor monitorBlock:[1000 timesRepeat:[UUID new]] > | > | > | > | '================ > | STATISTICAL SAMPLING RESULTS > | elapsed CPU time: 12308 ms > | monitoring interval: 1.0 ms > | > | tally % class and method name > | ------ ----- -------------------------------------- > | 2298 18.69 GsFile >> userAction:onClient: > | 1258 10.23 HostRandom >> integer > | 1111 9.04 SmallInteger >> bitShift: > | 944 7.68 GsFile >> next > | 914 7.43 Character >> asciiValue > | 906 7.37 GsFile Glass mailing list [hidden email] http://lists.gemtalksystems.com/mailman/listinfo/glass |
Am 17.09.2013 um 20:27 schrieb Paul DeBruicker <[hidden email]>:
> Thanks Dale, > > Tobias Pape replied off list that I should just use the FFI library as > Pharo is calling the libuuid on the platform anyway. So I'll work on > that. > oh I didn't notice it was off-list. sorry. Anyway, on OSX and I think Linux, Squeak/Pharo is using uuid_generate(3)/libuuid or uuidgen on systems like Free/NetBSD Note that the Squeak folk detected problems especially on Ubuntu ---causing segfaults when trying uuid stuff (which happens all the time with monticello)--- that date back to 2010. I remember folks at ESUG being bitten by that problem. See discussion here: http://forum.world.st/Fix-for-UUID-library-crashes-td3308033.html http://bugs.squeak.org/view.php?id=7358 The tricky solution there was to catch a possible segfault and continue with image-side in this case: (diff) http://squeakvm.org/cgi-bin/viewvc.cgi/squeak/trunk/platforms/unix/plugins/UUIDPlugin/sqUnixUUID.c?r1=2356&r2=2362 (code) http://squeakvm.org/cgi-bin/viewvc.cgi/squeak/trunk/platforms/unix/plugins/UUIDPlugin/sqUnixUUID.c?revision=2602&view=markup Best -Tobias _______________________________________________ Glass mailing list [hidden email] http://lists.gemtalksystems.com/mailman/listinfo/glass signature.asc (210 bytes) Download Attachment |
With the library here:
MCHttpRepository location: 'http://smalltalkhub.com/mc/pdebruic/UUIDFFI/main' user: '' password: '' The time on my machine to make 1000 UUIDs goes from 2000ms to 20ms. Thats on 64bit linux, with the libuuid Tobias mentioned. On 09/17/2013 11:46 AM, Tobias Pape wrote: > Am 17.09.2013 um 20:27 schrieb Paul DeBruicker <[hidden email]>: > >> Thanks Dale, >> >> Tobias Pape replied off list that I should just use the FFI library as >> Pharo is calling the libuuid on the platform anyway. So I'll work on >> that. >> > > oh I didn't notice it was off-list. sorry. > Anyway, on OSX and I think Linux, Squeak/Pharo is using uuid_generate(3)/libuuid > or uuidgen on systems like Free/NetBSD > > Note that the Squeak folk detected problems especially on Ubuntu > ---causing segfaults when trying uuid stuff (which happens all the time with > monticello)--- > that date back to 2010. I remember folks at ESUG being bitten by that > problem. > See discussion here: > http://forum.world.st/Fix-for-UUID-library-crashes-td3308033.html > http://bugs.squeak.org/view.php?id=7358 > > The tricky solution there was to catch a possible segfault > and continue with image-side in this case: > (diff) http://squeakvm.org/cgi-bin/viewvc.cgi/squeak/trunk/platforms/unix/plugins/UUIDPlugin/sqUnixUUID.c?r1=2356&r2=2362 > (code) http://squeakvm.org/cgi-bin/viewvc.cgi/squeak/trunk/platforms/unix/plugins/UUIDPlugin/sqUnixUUID.c?revision=2602&view=markup > > Best > -Tobias > > > > _______________________________________________ > Glass mailing list > [hidden email] > http://lists.gemtalksystems.com/mailman/listinfo/glass > _______________________________________________ Glass mailing list [hidden email] http://lists.gemtalksystems.com/mailman/listinfo/glass |
Am 17.09.2013 um 21:07 schrieb Paul DeBruicker <[hidden email]>:
> With the library here: > > MCHttpRepository > location: 'http://smalltalkhub.com/mc/pdebruic/UUIDFFI/main' > user: '' > password: '' > > > The time on my machine to make 1000 UUIDs goes from 2000ms to 20ms. > Best -Tobias _______________________________________________ Glass mailing list [hidden email] http://lists.gemtalksystems.com/mailman/listinfo/glass signature.asc (210 bytes) Download Attachment |
Free forum by Nabble | Edit this page |