Perl 脚本查找 Unix 上所有无主文件和目录 - 如何进一步优化?

发布于 2024-12-11 14:31:43 字数 1459 浏览 0 评论 0原文

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

許願樹丅啲祈禱 2024-12-18 14:31:43

尝试从这些开始,然后看看是否还有其他可以做的事情。

  1. 使用散列代替需要使用in_array()搜索的数组。这样您就可以一步执行直接哈希查找,而不是在每次迭代时将整个数组转换为哈希。

  2. 您不需要检查符号链接,因为您尚未设置 follow 选项,因此它们将被跳过。

  3. 最大限度地利用_;避免重复IO操作。 _ 是一个特殊的文件句柄,每当您调用 stat() 或任何文件测试时,都会在其中缓存文件状态信息。这意味着您可以调用 stat _-f _ 而不是 stat $name-f $name。 (在我的机器上调用 -f _-f $name 快 1000 倍以上,因为它使用缓存而不是执行另一个 IO 操作。)

  4. 使用Benchmark 模块测试不同的优化策略来看看你是否真的有所收获。例如

    使用基准;
    stat 'myfile.txt';
    计时这些(100_000,{
        一个=>子 {-f _},
        b =>子{-f'myfile.txt'},
    });
    
  5. 性能调优的一般原则是在尝试调优之前准确找出慢速部分的位置(因为慢速部分可能不在您期望的位置)。我的建议是使用 Devel::NYTProf,它可以为您生成一份html配置文件报告。从概要来看,如何使用它(从命令行):

    # 配置文件代码并将数据库写入 ./nytprof.out
    perl -d:NYTProf some_perl.pl
    
    # 将数据库转换为一组 html 文件,例如 ./nytprof/index.html
    # 并在 nytprof/index.html 文件上打开 Web 浏览器
    nytprofhtml --打开
    

Try starting with these, then see if there's anything more you can do.

  1. Use hashes instead of the arrays that need to be searched using in_array(). This is so you can do a direct hash lookup in one step instead of converting the entire array to a hash for every iteration.

  2. You don't need to check for symlinks because they will be skipped since you have not set the follow option.

  3. Maximise your use of _; avoid repeating IO operations. _ is a special filehandle where the file status information is cached whenever you call stat() or any file test. This means you can call stat _ or -f _ instead of stat $name or -f $name. (Calling -f _ is more than 1000x faster than -f $name on my machine because it uses the cache instead of doing another IO operation.)

  4. Use the Benchmark module to test out different optimisation strategies to see if you actually gain anything. E.g.

    use Benchmark;
    stat 'myfile.txt';
    timethese(100_000, {
        a => sub {-f _},
        b => sub {-f 'myfile.txt'},
    });
    
  5. A general principle of performance tuning is find out exactly where the slow parts are before you try to tune it (because the slow parts might not be where you expect them to be). My recommendation is to use Devel::NYTProf, which can generate an html profile report for you. From the synopsis, on how to use it (from the command line):

    # profile code and write database to ./nytprof.out
    perl -d:NYTProf some_perl.pl
    
    # convert database into a set of html files, e.g., ./nytprof/index.html
    # and open a web browser on the nytprof/index.html file
    nytprofhtml --open
    
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文