测试算法速度。怎么样?

时间:2013-09-17 16:36:12

标签: c performance profiling benchmarking micro-optimization

我目前正在测试不同的算法,这些算法确定整数是否为实数。在我的研究期间,我在SOF找到了这个问题: Fastest way to determine if an integer's square root is an integer

我对编程场景比较陌生。在测试问题中提出的不同算法时,我发现了这个

bool istQuadratSimple(int64 x)
{
    int32 tst = (int32)sqrt(x);
    return tst*tst == x;
}

实际上比我发布的问题中的A. Rex提供的工作更快。我已经使用NS-Timer对象进行此测试,使用NSLog打印我的结果。

我现在的问题是:如何以专业的方式完成速度测试?如何才能获得与我上面发布的问题中提供的结果相同的结果?

3 个答案:

答案 0 :(得分:1)

我不确定是否有任何专业方法来检查速度(如果有让我知道的话)。对于您在问题中指导的方法,我可能会在java中执行此操作。

package Programs;

import java.math.BigDecimal;
import java.math.RoundingMode;

public class SquareRootInteger {

    public static boolean isPerfectSquare(long n) {
        if (n < 0)
            return false;

        long tst = (long) (Math.sqrt(n) + 0.5);
        return tst * tst == n;
    }

    public static void main(String[] args) {
        long iterator = 1;
        int precision = 10;
        long startTime = System.nanoTime(); //Getting systems time before calling the isPerfectSquare method repeatedly 
        while (iterator < 1000000000) {
            isPerfectSquare(iterator);
            iterator++;
        }
        long endTime = System.nanoTime(); // Getting system time after the 1000000000 executions of isPerfectSquare method
        long duration = endTime - startTime;
        BigDecimal dur = new BigDecimal(duration);
        BigDecimal iter = new BigDecimal(iterator);
        System.out.println("Speed "
                + dur.divide(iter, precision, RoundingMode.HALF_UP).toString()
                + " nano secs"); // Getting average time taken for 1 execution of method.

    }
}

您可以用类似的方式检查您的方法,并检查哪一个优于其他方法。

更新: - 由于OP可能对java不熟悉,我在代码中添加了注释以更清楚地传递这个想法。如果我能得到一个建设性的反馈,为什么这个被投票,我会非常感谢。谢谢!

答案 1 :(得分:1)

在循环中调用此函数的问题是所有内容都将在缓存中(数据和指令)。你不会衡量任何合理的东西;我不会这样做。

考虑到这个函数有多小,我会试着看一下这个函数生成的汇编代码和另一个函数,我会尝试根据汇编代码(指令数和cost of the individual instructions)来推断,例如)。

不幸的是,它只适用于琐碎/近乎无关紧要的情况。例如,如果汇编代码相同,那么您就知道没有区别,您不需要测量任何东西。或者,如果一个代码与另一个代码相同,另外还有其在这种情况下,你知道执行时间越长越长。然后有不太明显的情况...... :(
(请参阅下面的更新。)

您可以使用来自clang的-S -emit-llvm标记和来自gcc的-S标记来获取程序集。

希望得到这个帮助。



更新:对Prateek's question in the comment 的回复“有没有办法确定某个特定算法的速度?”

是的,这是可能的,但它真的很复杂很快。简而言之,忽略现代处理器的复杂性并简单地累积与指令相关联的一些预定成本可能导致非常非常不准确的结果(由于高速缓存和管道等,估计偏差100倍)。如果你尝试考虑现代处理器,分层缓存,管道等的复杂性,那么事情很难实现。非常。请参阅示例Worst Case Execution Time Prediction

除非你处于一个明显的情况(微不足道/近乎无关紧要的情况),例如生成的汇编代码相同或者一个与另一个加上一些指令相同,否则很难根据生成的汇编来比较算法。

然而,这里显示了两条线的简单功能,为此,查看组件可能会有所帮助。因此,我的答案。

答案 2 :(得分:0)

  1. 记录大量计算之前的时间值以及之后的值。不同之处在于执行的时间。
  2. 编写一个shell脚本,您将在其中运行该程序。然后运行'time ./xxx.sh'来获取它的运行时间。