代码之家  ›  专栏  ›  技术社区  ›  ariefbayu

哪个更快:glob()或opendir()

  •  3
  • ariefbayu  · 技术社区  · 16 年前

    在glob()和opendir()之间,读取大约1-2k个文件的速度哪个更快?

    5 回复  |  直到 9 年前
        1
  •  8
  •   Nisse Engström sting_roc    9 年前

    http://code2design.com/forums/glob_vs_opendir

    明显地 opendir() 应该(而且是)更快,因为它打开目录处理程序并允许您迭代。因为 glob() 必须分析第一个参数这将需要更多的时间(另外 glob 处理递归目录,以便扫描subdir,这将增加执行时间。

        2
  •  7
  •   Community Mohan Dere    9 年前

    glob opendir 做不同的事情。 格洛布 查找与模式匹配的路径名并在数组中返回这些路径名,而 打开目录 仅返回目录句柄。得到与 格洛布 您必须调用其他函数,在基准测试时必须考虑这些函数,特别是如果这包括模式匹配。

    Bill Karwin 最近写了一篇关于这个的文章。见:

        3
  •  2
  •   Sarfraz    16 年前

    不确定这是否是完美的比较,但是 glob() 允许您在 opendir 通过加快速度直接访问目录。

        4
  •  1
  •   Igor Serebryany    16 年前

    另一个可以通过测试来回答的问题。我有一个方便的文件夹,里面有412件东西,但结果应该不会有太大变化,我想:

    igor47@whisker ~/test $ ls /media/music | wc -l
    412
    igor47@whisker ~/test $ time php opendir.php 
    414 files total
    
    real    0m0.023s
    user    0m0.000s
    sys 0m0.020s
    igor47@whisker ~/test $ time php glob.php 
    411 files total
    
    real    0m0.023s
    user    0m0.010s
    sys 0m0.010s
    
        5
  •  0
  •   dkellner    9 年前

    可以,

    长话短说:

    • 如果您想要完整的文件名+路径, 分类 ,地球几乎是无敌的。
    • 如果您想要完整的文件名+路径 未分类的 ,使用glob和glob-nosort。
    • 如果只需要名称而不需要排序,请使用opendir+loop。

    就是这样。

    还有一些想法:

    您可以使用不同的方法进行测试,以合成完全相同的结果,但发现它们的时间开销大致相同。仅仅为了获取信息,你不会有真正的赢家。但是,请考虑以下几点:

    1. 处理一个庞大的文件列表, glob排序会更快 -它使用文件系统的排序方法,这种方法总是比较好的。(它知道它排序什么,而php不知道,php排序任意字符串的散列数组,比较它们是不公平的。)

    2. 您可能希望通过一些glob非常有效的扩展名或文件名掩码来筛选列表。你有 fnMath() 当然,但是每次调用它的速度永远不会比为这项工作训练的系统级过滤器快。

    3. 另一方面, 格洛布 返回的文本量要大得多(每个名称都有完整路径),因此对于许多文件,可能会遇到内存分配限制。对于无数的文件来说,glob不是你的朋友。