为什么在这个图像处理测试中Swift比C慢100倍?
参见英文答案 >
Swift performance: sorting arrays8个答案像许多其他开发人员一样,我对来自苹果的新Swift语言感到非常兴奋。苹果声称它的速度比Objective C快,可以用来编写操作系统。从我迄今为止学到的,它是一个静态类型语言,能够精确控制确切的数据类型(如整数长度)。所以它看起来像具有良好的潜在处理性能关键任务,如图像处理,对吧?
这是我在我进行一个快速测试之前的想法。结果真的让我感到惊讶。 这里是一个简单的代码片段在C: test.c: #include <stdio.h> #include <stdint.h> #include <string.h> uint8_t pixels[640*480]; uint8_t alpha[640*480]; uint8_t blended[640*480]; void blend(uint8_t* px,uint8_t* al,uint8_t* result,int size) { for(int i=0; i<size; i++) { result[i] = (uint8_t)(((uint16_t)px[i]) *al[i] /255); } } int main(void) { memset(pixels,128,640*480); memset(alpha,640*480); memset(blended,255,640*480); // Test 10 frames for(int i=0; i<10; i++) { blend(pixels,alpha,blended,640*480); } return 0; } 我使用以下命令在我的Macbook Air 2011上编译: clang -O3 test.c -o test 10帧处理时间约为0.01s。换句话说,C代码1ms处理一帧: $ time ./test real 0m0.010s user 0m0.006s sys 0m0.003s 然后我有一个Swift版本的相同的代码: test.swift: let pixels = UInt8[](count: 640*480,repeatedValue: 128) let alpha = UInt8[](count: 640*480,repeatedValue: 128) let blended = UInt8[](count: 640*480,repeatedValue: 255) func blend(px: UInt8[],al: UInt8[],result: UInt8[],size: Int) { for(var i=0; i<size; i++) { var b = (UInt16)(px[i]) * (UInt16)(al[i]) result[i] = (UInt8)(b/255) } } for i in 0..10 { blend(pixels,640*480) } 构建命令行是: xcrun swift -O3 test.swift -o test 这里我使用相同的O3级优化标志使比较有希望公平。但是,结果速度慢100倍: $ time ./test real 0m1.172s user 0m1.146s sys 0m0.006s 换句话说,它需要Swift?120ms来处理一帧,C只需要1ms。 发生了什么? 更新:我使用clang: $ gcc -v Configured with: --prefix=/Applications/Xcode6-Beta.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 Apple LLVM version 6.0 (clang-600.0.34.4) (based on LLVM 3.5svn) Target: x86_64-apple-darwin13.2.0 Thread model: posix 更新:具有不同运行迭代的更多结果: 这里是不同数量的“帧”的结果,即将主循环数从10改变为其他数。现在注意我得到更快的C代码时间(缓存热?),而Swift时间不会改变太多: C Time (s) Swift Time (s) 1 frame: 0.005 0.130 10 frames(*): 0.006 1.196 20 frames: 0.008 2.397 100 frames: 0.024 11.668 更新:`-Ofast`帮助 由@mweathers建议的-Ofast,Swift速度上升到合理的范围。 在我的笔记本电脑上,-Ofast的Swift版本获得了0.013s的10帧和0.048s的100帧,接近一半的C性能。
建筑:
xcrun swift -Ofast test.swift -o test 我有时间: real 0m0.052s user 0m0.009s sys 0m0.005s (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |