【问题标题】:Fortran findloc intrinsicFortran findloc 内在函数
【发布时间】:2013-02-18 11:52:09
【问题描述】:

我正在使用 Intel 的 Visual Fortran Composer XE 2011, 12.1.3537.2010,看起来,不支持固有的 findloc 函数(在 2008 fortran 中型扩展中添加)。

我想做的是在数组中查找特定值并返回索引。我主要使用小型数组。

我有两个问题:

  1. 我想用此功能替换线性和二进制搜索,当我在其他线程中阅读时,不清楚哪种算法更适合获得最佳性能。内在函数如何处理这个问题?
  2. 由于我的编译器不支持此功能,因此模拟findloc 的方法如下:

    minloc( (array-value)**2 )
    

    但是……性能呢?还有其他想法吗?

【问题讨论】:

    标签: fortran


    【解决方案1】:

    如果我正确理解您的第一个问题,您想知道一个尚未实现的功能是如何实现的?具体来说,您想知道findloc 与您自己实现的线性和二分搜索相比的性能特征吗?语言标准中肯定没有任何内容规定如何实现该函数,因此您的问题的答案完全取决于编译器。

    关于您的第二个问题,我希望大多数编译器会创建一个临时数组以响应您的表达式array-value。这样一个临时的创建很可能是一个比较耗时的操作,并且会添加到调用minloc的执行时间。 minloc 的英特尔实现如何工作我不知道,但我希望它是通过阵列的线性扫描。内部函数无法知道数组是否已排序并且二进制搜索可能会更快。

    如果您的数组很小且未排序,我希望线性搜索是最快的选择。如果它们很小且已排序,您可能可以编写二进制搜索(或类似的)以优于线性搜索。我希望这两种方法的性能图会有一个交叉,这个交叉与你的小尺寸的想法有关。我不知道。

    但是,与性能问题一样,我(或其他任何人)认为是无用的,数据就是您所需要的,您为什么不继续进行一些测量?

    【讨论】:

    • 谢谢。您确实正确理解了我的第一个问题。关于第二个,我的数组是小尺寸的(其中小 = 通常是十分之几的元素,很少是百分之几)并且已排序。在了解了预期结果后,我想继续进行测量。但我想,这很难说,因为它完全取决于编译器。一旦我有值得分享的东西,我会尽快通知你。
    【解决方案2】:

    如果您关心性能,请自行编写,可能是多线程版本。 minloc 的解决方法是众所周知的,已经在 comp.lang.fortran 上讨论过多次,但如果你想要性能,它真的对你不利。舍入或溢出也可能存在问题。

    如果你有一个通用数组,你必须线性遍历它,如果它是排序的并且很大,你可以使用二分查找(但请注意,每次比较它通常有更大的开销)。

    【讨论】:

      猜你喜欢
      • 2013-11-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-31
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多