转载:http://nshipster.cn/benchmarking/
对于完成有意义的工作来说抽象很重要,但却会带来副作用。为了工作起来更顺手我们需要洞察一些细枝末节来确定一些批量处理的具体逻辑。找到一个特定上下文的有用信息是非常重要的,是具有挑战性的,是高效编程的核心。
利用benchmarking,工程师可以揭开他们代码中运行效率的面纱,然后利用获得的信息来优化。这对于每一位想让app运行更快的工程师(或者说每一个自重的工程师)来说都是必备工具。
“benchmark”这个词可以追溯到19世纪。它的本意是,一个 benchmark 就是一个一种把石头切割成平板的切刀或用来测量的支架。后来这个词的“测量东西的标准”的比喻义被应用到各种领域了。
在编程中, benchmark 和 benchmarking 略微有语义上的区别:
benchmark 是程序明确地要测量并比较硬件以及软件上的运行效率。相对来说 benchmarking 表示的则是测量效率的一段代码。
Objective-C 中使用 Benchmarking 测量效率
Benchmark应该和其他认知论有一样的规律可遵循,像统计量那样的科学方法一样有通用的理解。
科学方法涵盖了一系列的逻辑步骤来推演问题:
- 提出问题
- 构造假说
- 预期结果
- 验证假说
- 分析结果
当应用到编程时,一般来说会提出两类问题:
- 这段代码的 绝对 效率是多少?达到了计算力和内存的上限了吗?应用不同样本大小时的瓶颈操作是什么?
- 这段代码的 相对 效率是多少?方法 A 和 方法 B 哪个更快?
因为从操作系统本身的一切基本因素都是可变性非常强的,性能应该通过大量的试验来测量。对于大多数应用来说,样本数量在 105 到 108 直接是合理的。
第一发:CFAbsoluteTimeGetCurrent
这里例子中,我们看一看向可变数组中添加元素的效率。
为了建立 benchmark,我们指定一个 count
表示有多少个元素需要添加,iterations
表示这个测试要运行多少次。
Objective-C
static size_t const count = 1000;
static size_t const iterations = 10000;
因为我们不需要测试申请内存的时间,所以我们在 benchmark 外部只声明一次要添加进数组的元素。
Objective-C
id object = @"