nim-lang - 从多个文件读取字节性能

标签 nim-lang

所以我有这段代码来检查目录中每个文件的文件类型。 只需读取前 4 个字节并检查模式。

代码看起来有点复杂,而且速度很慢,但我想不出在 Nim 中更快的方法。

我做错了什么?

  import os

  var
    buf {.noinit.}: array[4, char]

  let out_pat = ['{', '\\', 'r', 't']
  var
    flag = true
    num_read = 0

  var dirname = "/some/path/*"

  for path in walkFiles(dirname):
      num_read = open(path).readChars(buf, 0, 4)
      for i in 0..num_read-1:
        if buf[i] != out_pat[i]:
          flag = false
      if flag:
        echo path
      flag = true

作为比较,Python 代码速度快了 2 倍:

def find_rtf(dir_):
    for path in glob.glob(dir_):
        with open(path,'rb') as f:
            if f.read(4) == b'{\\rt':
                print(path)
find_rtf("/some/path/*")

常规 cli 比 Python 快大约 10 倍,但在遇到 10^6+ 文件时存在一些管道错误

time find ./ -type f -print0 | LC_ALL=C xargs -0 -P 6 -n 100 head -c 5 -v| grep "{\\\rt" -B 1

最佳答案

在我的系统 (Linux) 上,Nim 版本的速度是 Python 版本的两倍。但也许我的文件是错误的。您使用什么操作系统?

如果文件短于 4 个字节,您应该关闭文件,并且您的比较是错误的。这是一个小的清理:

import os

const
  out_pat = ['{', '\\', 'r', 't']
  dirname = "/some/path/*"

for path in walkFiles(dirname):
  var buf: array[4, char]
  let file = open(path)
  defer: close(file) # Always close file when it goes out of scope
  discard file.readChars(buf, 0, 4)
  if buf == out_pat:
    echo path

确保使用 nim -d:release c foobar.nim 进行编译。

当您同时使用 6 个进程时,命令行版本要快得多。使用 -P 1 而不是 -P 6 对我来说,它与 Nim 版本一样快。

关于nim-lang - 从多个文件读取字节性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34427858/

相关文章:

oop - Nim 中的无根据方法是什么?

nim-lang - Nim 和内存管理

performance - Nim 检查 :off vs -d:release

nim-lang - 将 int 类型转换为 uint8

c++ - 将 Nim Anon 函数导出到 C++

metaprogramming - 将 2014 Nim 翻译成 2019 Nim

macos - 在 OSX 上的 Nim 中播放 .wav 文件的简单方法是什么?

将 ptr ptr 转换为 Nim 数组

nim-lang - nim 中 reduce 的等价物是什么?