Use Int literals instead of characters in Bytes.int, .float, and .double propertys

This gives ~94% speed improvment
This commit is contained in:
Caleb Kleveter 2019-04-19 09:26:18 -05:00
parent d4f82e6c77
commit cc8f568e21
No known key found for this signature in database
GPG Key ID: B38DBD5CF2C98D69
2 changed files with 41 additions and 41 deletions

View File

@ -8,7 +8,7 @@ extension Array where Element == UInt8 {
let direction: Int
var iterator: Int
if self.first == "-" {
if self.first == 45 {
iterator = self.startIndex + 1
direction = -1
} else {
@ -18,17 +18,17 @@ extension Array where Element == UInt8 {
while iterator < count {
switch self[iterator] {
case "0": result = result * 10
case "1": result = (result * 10) + 1
case "2": result = (result * 10) + 2
case "3": result = (result * 10) + 3
case "4": result = (result * 10) + 4
case "5": result = (result * 10) + 5
case "6": result = (result * 10) + 6
case "7": result = (result * 10) + 7
case "8": result = (result * 10) + 8
case "9": result = (result * 10) + 9
case ",": break
case 48: result = result &* 10
case 49: result = (result &* 10) &+ 1
case 50: result = (result &* 10) &+ 2
case 51: result = (result &* 10) &+ 3
case 52: result = (result &* 10) &+ 4
case 53: result = (result &* 10) &+ 5
case 54: result = (result &* 10) &+ 6
case 55: result = (result &* 10) &+ 7
case 56: result = (result &* 10) &+ 8
case 57: result = (result &* 10) &+ 9
case 44: break
default: return nil
}
@ -46,7 +46,7 @@ extension Array where Element == UInt8 {
let direction: Int
var iterator: Int
if self.first == "-" {
if self.first == 45 {
iterator = self.startIndex + 1
direction = -1
} else {
@ -56,18 +56,18 @@ extension Array where Element == UInt8 {
while iterator < count {
switch self[iterator] {
case "0": result = result * 10
case "1": result = (result * 10) + 1
case "2": result = (result * 10) + 2
case "3": result = (result * 10) + 3
case "4": result = (result * 10) + 4
case "5": result = (result * 10) + 5
case "6": result = (result * 10) + 6
case "7": result = (result * 10) + 7
case "8": result = (result * 10) + 8
case "9": result = (result * 10) + 9
case ".": decimal = pow(10, Float(count - 1 - iterator))
case ",": break
case 48: result = result &* 10
case 49: result = (result &* 10) &+ 1
case 50: result = (result &* 10) &+ 2
case 51: result = (result &* 10) &+ 3
case 52: result = (result &* 10) &+ 4
case 53: result = (result &* 10) &+ 5
case 54: result = (result &* 10) &+ 6
case 55: result = (result &* 10) &+ 7
case 56: result = (result &* 10) &+ 8
case 57: result = (result &* 10) &+ 9
case 46: decimal = pow(10, Float(count - 1 - iterator))
case 44: break
default: return nil
}
@ -85,7 +85,7 @@ extension Array where Element == UInt8 {
let direction: Int
var iterator: Int
if self.first == "-" {
if self.first == 45 {
iterator = self.startIndex + 1
direction = -1
} else {
@ -95,18 +95,18 @@ extension Array where Element == UInt8 {
while iterator < count {
switch self[iterator] {
case "0": result = result * 10
case "1": result = (result * 10) + 1
case "2": result = (result * 10) + 2
case "3": result = (result * 10) + 3
case "4": result = (result * 10) + 4
case "5": result = (result * 10) + 5
case "6": result = (result * 10) + 6
case "7": result = (result * 10) + 7
case "8": result = (result * 10) + 8
case "9": result = (result * 10) + 9
case ".": decimal = pow(10, Double(count - 1 - iterator))
case ",": break
case 48: result = result &* 10
case 49: result = (result &* 10) &+ 1
case 50: result = (result &* 10) &+ 2
case 51: result = (result &* 10) &+ 3
case 52: result = (result &* 10) &+ 4
case 53: result = (result &* 10) &+ 5
case 54: result = (result &* 10) &+ 6
case 55: result = (result &* 10) &+ 7
case 56: result = (result &* 10) &+ 8
case 57: result = (result &* 10) &+ 9
case 46: decimal = pow(10, Double(count - 1 - iterator))
case 44: break
default: return nil
}

View File

@ -18,7 +18,7 @@ final class UtilityTests: XCTestCase {
func testMeasureBytesToInt() {
// 0.095
// 0.005
measure {
for _ in 0..<100_000 {
_ = self.intBytes.int
@ -34,7 +34,7 @@ final class UtilityTests: XCTestCase {
func testMeasureBytesToFloat() {
// 0.097
// 0.007
measure {
for _ in 0..<100_000 {
_ = self.floatBytes.float
@ -50,7 +50,7 @@ final class UtilityTests: XCTestCase {
func testMeasureBytesToDouble() {
// 0.100
// 0.007
measure {
for _ in 0..<100_000 {
_ = self.doubleBytes.double