swift - 在我的 swift 实现中逐个读取字符串 char 非常慢

标签 swift cocoa filehandler

我必须快速逐个字符地读取文件。我这样做的方式是从 FileHandler 读取一个 block 并返回字符串的第一个字符。

到目前为止,这是我的代码:

/// Return next character, or nil on EOF.
func nextChar() -> Character? {
    precondition(fileHandle != nil, "Attempt to read from closed file")

    if atEof {
        return nil
    }

    if self.stored.characters.count > 0 {
        let c: Character = self.stored.characters.first!
        stored.remove(at: self.stored.startIndex)
        return c
    }

    let tmpData = fileHandle.readData(ofLength: (4096))
    print("\n---- file read ---\n" , terminator: "")
    if tmpData.count == 0 {
        return nil
    }

    self.stored = NSString(data: tmpData, encoding: encoding.rawValue) as String!
    let c: Character = self.stored.characters.first!
    self.stored.remove(at: stored.startIndex)
    return c
}

我的问题是角色的返回速度非常慢。 这是我的测试实现:

if let aStreamReader = StreamReader(path: file) {
    defer {
        aStreamReader.close()
    }
    while let char = aStreamReader.nextChar() {
        print("\(char)", terminator: "")
        continue
    }
}

即使没有打印出来,也需要很长时间才能读完文件。

对于一个 1.4mb 的示例文件,完成任务需要六分多钟。

time ./.build/debug/read a.txt
real    6m22.218s
user    6m13.181s
sys     0m2.998s

你对如何加快这部分有什么意见吗?

let c: Character = self.stored.characters.first!
stored.remove(at: self.stored.startIndex)
return c

非常感谢。 附言

++++ 更新函数++++

func nextChar() -> Character? {
    //precondition(fileHandle != nil, "Attempt to read from closed file")

    if atEof {
        return nil
    }

    if stored_cnt > (stored_idx + 1) {
        stored_idx += 1
        return stored[stored_idx]
    }

    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 = s.characters.map { $0 }
        stored_idx = 0
        stored_cnt = stored.count
    }
    return stored[0];
}

最佳答案

nextChar 的实现效率极低。

您创建一个 String,然后一遍又一遍地调用 characters,然后一遍又一遍地更新那组字符。

为什么不创建 String 然后只存储对其 characters 的引用。然后跟踪到 characters 的索引。与其一遍又一遍地更新它,不如简单地增加索引并返回下一个字符。无需一遍又一遍地更新字符串。

一旦到达最后一个字符,请阅读文件的下一部分。创建一个新字符串,重新设置字符和索引。

关于swift - 在我的 swift 实现中逐个读取字符串 char 非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40296020/

相关文章:

ios - 解析- swift : Concatenate Queries

java - Java 8 中的 java.util.logging.FileHandler 损坏了吗?

带有常量 header 的 Java 旋转日志

ios - 如何实现嵌入 slider 来显示数据?

ios - NSTemporaryDirectory 中的 Alamofire MultiPartForm 文件

ios - 如何用SKLightNode获取正午阳光的影子

macos - 控制我的应用程序中的其他应用程序(在沙箱中)

ios - 递归函数或 block 的堆栈和堆条件?

Cocoa 应用程序中的 MySQL 客户端