为什么在这个图像处理测试中Swift比C慢100倍?

为什么在这个图像处理测试中Swift比C慢100倍?,第1张

概述参见英文答案 > Swift performance: sorting arrays                                    8个答案                            像许多其他开发人员一样,我对来自苹果的新Swift语言感到非常兴奋。苹果声称它的速度比Objective C快,可以用来编写 *** 作系统。从我迄今为止学到的,它是一个静态类型语言,能够 参见英文答案 > Swift performance: sorting arrays8个答案像许多其他开发人员一样,我对来自苹果的新Swift语言感到非常兴奋。苹果声称它的速度比Objective C快,可以用来编写 *** 作系统。从我迄今为止学到的,它是一个静态类型语言,能够精确控制确切的数据类型(如整数长度)。所以它看起来像具有良好的潜在处理性能关键任务,如图像处理,对吧? @H_301_1@这是我在我进行一个快速测试之前的想法。结果真的让我感到惊讶。

@H_301_1@这里是一个简单的代码片段在C:

@H_301_1@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;}
@H_301_1@我使用以下命令在我的Macbook Air 2011上编译:

clang -O3 test.c -o test
@H_301_1@10帧处理时间约为0.01s。换句话说,C代码1ms处理一帧:

$ time ./testreal    0m0.010suser    0m0.006ssys     0m0.003s
@H_301_1@然后我有一个Swift版本的相同的代码:

@H_301_1@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)}
@H_301_1@构建命令行是:

xcrun swift -O3 test.swift -o test
@H_301_1@这里我使用相同的O3级优化标志使比较有希望公平。但是,结果速度慢100倍:

$ time ./testreal    0m1.172suser    0m1.146ssys     0m0.006s
@H_301_1@换句话说,它需要Swift〜120ms来处理一帧,C只需要1ms。

@H_301_1@发生了什么?

@H_301_1@更新:我使用clang:

$ gcc -vConfigured with: --prefix=/Applications/Xcode6-Beta.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1Apple LLVM version 6.0 (clang-600.0.34.4) (based on LLVM 3.5svn)Target: x86_64-apple-darwin13.2.0Thread model: posix
@H_301_1@更新:具有不同运行迭代的更多结果:

@H_301_1@这里是不同数量的“帧”的结果,即将主循环数从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.397100 frames:    0.024           11.668
@H_301_1@更新:`-Ofast`帮助

@H_301_1@由@mweathers建议的-Ofast,Swift速度上升到合理的范围。

@H_301_1@在我的笔记本电脑上,-Ofast的Swift版本获得了0.013s的10帧和0.048s的100帧,接近一半的C性能。

建筑: @H_301_1@xcrun swift -Ofast test.swift -o test

@H_301_1@我有时间:

real    0m0.052suser    0m0.009ssys 0m0.005s
总结

以上是内存溢出为你收集整理的为什么在这个图像处理测试中Swift比C慢100倍?全部内容,希望文章能够帮你解决为什么在这个图像处理测试中Swift比C慢100倍?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1059611.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存