From 1fdcf77fd83fb732ffc9802494307b87ad866d20 Mon Sep 17 00:00:00 2001 From: Alex Wishart Date: Thu, 17 Aug 2017 13:37:44 +0100 Subject: [PATCH 1/7] Adding function to test Data->String optimisation --- DataToString.swift | 45 ++++++++++++++++++++++++++++++++++++++++++++- StringToData.swift | 4 ++++ 2 files changed, 48 insertions(+), 1 deletion(-) mode change 100644 => 100755 DataToString.swift diff --git a/DataToString.swift b/DataToString.swift old mode 100644 new mode 100755 index f439d36..cd8c5b8 --- a/DataToString.swift +++ b/DataToString.swift @@ -129,10 +129,39 @@ func makeStringB(data: Data) -> String { } ?? "" } +func dataToString(data: Data) -> String { + let rawData: UnsafePointer + rawData = data.withUnsafeBytes { (u8Ptr: UnsafePointer) in + //let rawPtr = UnsafeRawPointer(u8Ptr) + return u8Ptr + } + + let newData = Data(bytes: rawData, count: data.count) + + let newRawData: UnsafePointer + newRawData = newData.withUnsafeBytes { (u8Ptr: UnsafePointer) in + return u8Ptr + } + let string = String( + _StringCore( + baseAddress: UnsafeMutableRawPointer(mutating: rawnData), + count: Int(10), + elementShift: 0, + hasCocoaBuffer: false, + owner: nil + ) + ) + + + return string ?? "" + +} + // Block to be scheduled func code(block: Int, loops: Int) -> () -> Void { return { var string: String? + var nsstring: NSString? let lDATA = DATAS[block-1] if METHOD == 1 { for _ in 1...EFFORT { @@ -142,7 +171,21 @@ return { for _ in 1...EFFORT { string = makeString(data: lDATA) } - } else { + } else if METHOD == 0 { + for _ in 1...EFFORT { + string = String(repeating: "a", count: 6) + } +// } else if METHOD == 3 { +// for _ in 1...EFFORT { +// nsstring = NSString(data: lDATA, encoding: Encoding.utf8.rawValue)! +// } + } + else if METHOD == 3 { + for _ in 1...EFFORT { + string = dataToString(data: lDATA) + } + } + else { for _ in 1...EFFORT { string = makeStringB(data: lDATA) } diff --git a/StringToData.swift b/StringToData.swift index dff8f42..5719a21 100644 --- a/StringToData.swift +++ b/StringToData.swift @@ -140,6 +140,10 @@ return { for _ in 1...EFFORT { data = lSTRING.asciiData(using: .utf8)! } + case 4: + for _ in 1...EFFORT { + data = lSTRING.asciiData(using: .utf8)! + } default: print("Error - unknown method") return From a940a6fb01a32408e7b969ceb863dc0683b7999b Mon Sep 17 00:00:00 2001 From: Alex Wishart Date: Thu, 17 Aug 2017 13:45:38 +0100 Subject: [PATCH 2/7] Fix type --- DataToString.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DataToString.swift b/DataToString.swift index cd8c5b8..5bb85f4 100755 --- a/DataToString.swift +++ b/DataToString.swift @@ -144,7 +144,7 @@ func dataToString(data: Data) -> String { } let string = String( _StringCore( - baseAddress: UnsafeMutableRawPointer(mutating: rawnData), + baseAddress: UnsafeMutableRawPointer(mutating: newRawData), count: Int(10), elementShift: 0, hasCocoaBuffer: false, From 5ef6b853adb403fd8502299366a30f6fd311a187 Mon Sep 17 00:00:00 2001 From: Alex Wishart Date: Tue, 22 Aug 2017 15:29:02 +0100 Subject: [PATCH 3/7] New implementation for Data->String --- DataToString.swift | 29 ++++++++++++----------------- 1 file changed, 12 insertions(+), 17 deletions(-) diff --git a/DataToString.swift b/DataToString.swift index 5bb85f4..deb52cf 100755 --- a/DataToString.swift +++ b/DataToString.swift @@ -132,29 +132,24 @@ func makeStringB(data: Data) -> String { func dataToString(data: Data) -> String { let rawData: UnsafePointer rawData = data.withUnsafeBytes { (u8Ptr: UnsafePointer) in - //let rawPtr = UnsafeRawPointer(u8Ptr) return u8Ptr } - let newData = Data(bytes: rawData, count: data.count) - - let newRawData: UnsafePointer - newRawData = newData.withUnsafeBytes { (u8Ptr: UnsafePointer) in - return u8Ptr - } - let string = String( - _StringCore( - baseAddress: UnsafeMutableRawPointer(mutating: newRawData), - count: Int(10), - elementShift: 0, - hasCocoaBuffer: false, - owner: nil - ) - ) + let uint8Pointer = UnsafeMutablePointer.allocate(capacity: data.count) + uint8Pointer.initialize(from: rawData, count: data.count) + print(uint8Pointer) - return string ?? "" + let string = String(_StringCore( + baseAddress: uint8Pointer, + count: Int(data.count), + elementShift: 0, + hasCocoaBuffer: false, + owner: nil + + )) + return string } // Block to be scheduled From e2c68bfaabc128b6a252e224ea2f87c7fe358166 Mon Sep 17 00:00:00 2001 From: Alex Wishart Date: Tue, 22 Aug 2017 15:57:30 +0100 Subject: [PATCH 4/7] Remove print statement --- DataToString.swift | 2 -- 1 file changed, 2 deletions(-) diff --git a/DataToString.swift b/DataToString.swift index deb52cf..6589682 100755 --- a/DataToString.swift +++ b/DataToString.swift @@ -138,8 +138,6 @@ func dataToString(data: Data) -> String { let uint8Pointer = UnsafeMutablePointer.allocate(capacity: data.count) uint8Pointer.initialize(from: rawData, count: data.count) - print(uint8Pointer) - let string = String(_StringCore( baseAddress: uint8Pointer, count: Int(data.count), From 70d78a52681ee15b326f71874b066361e347a378 Mon Sep 17 00:00:00 2001 From: Alex Wishart Date: Thu, 24 Aug 2017 10:31:04 +0100 Subject: [PATCH 5/7] Attempt to fix memory leak --- DataToString.swift | 34 +++++++++++++++++++++++++--------- 1 file changed, 25 insertions(+), 9 deletions(-) diff --git a/DataToString.swift b/DataToString.swift index 6589682..8443811 100755 --- a/DataToString.swift +++ b/DataToString.swift @@ -113,6 +113,28 @@ let lock = DispatchSemaphore(value: 1) var completeLoops:Int = 0 var RUNNING = true +class Holder { + var pointer: UnsafeMutablePointer! + var count: Int! + + + init(data: Data) + { + let rawData: UnsafePointer + rawData = data.withUnsafeBytes { (u8Ptr: UnsafePointer) in + return u8Ptr + } + let uint8Pointer = UnsafeMutablePointer.allocate(capacity: data.count) + uint8Pointer.initialize(from: rawData, count: data.count) + pointer = uint8Pointer + count = data.count + } + + deinit { + pointer.deallocate(capacity: count) + } +} + func makeString(data: Data) -> String { let array = Array(data) + [0] return array.withUnsafeBytes { rawBuffer in @@ -130,26 +152,20 @@ func makeStringB(data: Data) -> String { } func dataToString(data: Data) -> String { - let rawData: UnsafePointer - rawData = data.withUnsafeBytes { (u8Ptr: UnsafePointer) in - return u8Ptr - } - - let uint8Pointer = UnsafeMutablePointer.allocate(capacity: data.count) - uint8Pointer.initialize(from: rawData, count: data.count) + let holder = Holder(data: data) let string = String(_StringCore( baseAddress: uint8Pointer, count: Int(data.count), elementShift: 0, hasCocoaBuffer: false, - owner: nil - + owner: holder )) return string } + // Block to be scheduled func code(block: Int, loops: Int) -> () -> Void { return { From a7026fc52c31828f320a9b3012b3968f89e2e433 Mon Sep 17 00:00:00 2001 From: Alex Wishart Date: Thu, 24 Aug 2017 10:33:10 +0100 Subject: [PATCH 6/7] Fix reference to pointer --- DataToString.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/DataToString.swift b/DataToString.swift index 8443811..519ebc8 100755 --- a/DataToString.swift +++ b/DataToString.swift @@ -155,7 +155,7 @@ func dataToString(data: Data) -> String { let holder = Holder(data: data) let string = String(_StringCore( - baseAddress: uint8Pointer, + baseAddress: holder.pointer, count: Int(data.count), elementShift: 0, hasCocoaBuffer: false, From 05b2ddc48af052a1cc3b98cc114a75beabb55e2e Mon Sep 17 00:00:00 2001 From: Alex Wishart Date: Thu, 24 Aug 2017 14:46:14 +0100 Subject: [PATCH 7/7] Revert accidental changes to StrignToData --- StringToData.swift | 4 ---- 1 file changed, 4 deletions(-) diff --git a/StringToData.swift b/StringToData.swift index 5719a21..dff8f42 100644 --- a/StringToData.swift +++ b/StringToData.swift @@ -140,10 +140,6 @@ return { for _ in 1...EFFORT { data = lSTRING.asciiData(using: .utf8)! } - case 4: - for _ in 1...EFFORT { - data = lSTRING.asciiData(using: .utf8)! - } default: print("Error - unknown method") return