我必須通過字符閱讀器快速寫出一個真正的快速字符。這是我迄今爲止的解決方案。什麼是Swift中最快的Char-By-Char-Reader
對於一個1.4MB的文件,我得到它在0m0.932s。對於一個150MB的文件,它需要1m42.931s
你知道更快的解決方案嗎?
import Foundation
class CharReader {
let encoding : String.Encoding
let chunkSize : Int
var fileHandle : FileHandle!
let buffer : NSMutableData!
var atEof : Bool = false
var characterPointer: UnsafeMutablePointer<Character>
var startPointer: UnsafeMutablePointer<Character>
var stored_cnt: Int = 0;
var stored_idx: Int = 0;
init?(path: String, encoding: String.Encoding = String.Encoding.utf8, chunkSize : Int = 1024) {
self.chunkSize = chunkSize
self.encoding = encoding
characterPointer = UnsafeMutablePointer<Character>.allocate(capacity: chunkSize)
startPointer = characterPointer
if let fileHandle = FileHandle(forReadingAtPath: path),
let buffer = NSMutableData(capacity: chunkSize){
self.fileHandle = fileHandle
self.buffer = buffer
} else {
self.fileHandle = nil
self.buffer = nil
return nil
}
}
deinit {
self.close()
}
func nextChar() -> Character? {
if atEof {
return nil
}
if stored_cnt > (stored_idx + 1) {
stored_idx += 1
let char = characterPointer.pointee
characterPointer = characterPointer.successor()
return char
}
let tmpData = fileHandle.readData(ofLength: (chunkSize))
if tmpData.count == 0 {
atEof = true
return nil
}
if let s = NSString(data: tmpData, encoding: encoding.rawValue) as String! {
stored_idx = 0
let characters = s.characters
stored_cnt = characters.count
characterPointer = startPointer
characterPointer.initialize(from: characters)
let char = characterPointer.pointee
characterPointer = characterPointer.successor()
return char
}
return nil;
}
/// Close the underlying file. No reading must be done after calling this method.
func close() -> Void {
fileHandle?.closeFile()
fileHandle = nil
}
}
請讓我知道。
我測試類此main.swfit:
import Foundation
if CommandLine.arguments.count < 2 {
print("Too less arguments.")
exit(0)
}
let file = CommandLine.arguments[1]
if let aCharReader = CharReader(path: file) {
defer {
aCharReader.close()
}
while let char = aCharReader.nextChar() {
continue
}
}
該項目在GitHub上:https://github.com/petershaw/charsinfile
非常感謝, PS
你的文件有多大?你能把它完全讀入一個字符串嗎? (順便說一句,代碼看起來很模糊,是從http://stackoverflow.com/a/24648951/1187415獲得的嗎?) –
取決於從字節到多個集合 –
它是純ASCII還是包含任意Unicode字符? –