이 이미지 처리 테스트에서 Swift가 C보다 100 배 느린 이유는 무엇입니까?
이 질문에 이미 답변이 있습니다.
다른 많은 개발자들과 마찬가지로 저는 Apple의 새로운 Swift 언어에 대해 매우 흥분했습니다. Apple은 속도가 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, 128, 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.01 초입니다. 즉, 한 프레임을 처리하는 데 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, alpha, blended, 640*480)
}
빌드 명령 줄은 다음과 같습니다.
xcrun swift -O3 test.swift -o test
여기서는 동일한 O3
수준의 최적화 플래그를 사용하여 비교를 공정하게 만듭니다. 그러나 결과 속도는 100 배 느립니다.
$ time ./test
real 0m1.172s
user 0m1.146s
sys 0m0.006s
즉, C가 1ms 만 걸리는 한 프레임을 처리하는 데 Swift ~ 120ms가 걸립니다.
어떻게 된 거예요?
업데이트 : 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
업데이트 : 다른 실행 반복으로 더 많은 결과 :
다음은 다른 수의 "프레임"에 대한 결과입니다. 즉, 메인 for
루프 번호를 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` 도움
With -Ofast
suggested by @mweathers, the Swift speed goes up to reasonable range.
On my laptop the Swift version with -Ofast
gets 0.013s for 10 frames and 0.048s for 100 frames, close to half of the C performance.
Building with:
xcrun swift -Ofast test.swift -o test
I'm getting times of:
real 0m0.052s
user 0m0.009s
sys 0m0.005s
Let's just concentrate on the answer to the question, which started with a "Why": Because you didn't turn optimisations on, and Swift relies heavily on compiler optimisation.
That said, doing image processing in C is truly daft. That's what you have CGImage and friends for.
ReferenceURL : https://stackoverflow.com/questions/24102609/why-swift-is-100-times-slower-than-c-in-this-image-processing-test
'Program Tip' 카테고리의 다른 글
API 등급 제한 방법 (0) | 2021.01.08 |
---|---|
성능을 향상 시키려면 어떤 PHP opcode cacher를 사용해야합니까? (0) | 2020.12.27 |
PHP를 사용하여 웹 사이트에서 OCR을 구현하려면 어떻게해야합니까? (0) | 2020.12.27 |
R에서 대규모 네트워크를 시각화하는 방법은 무엇입니까? (0) | 2020.12.27 |
403-금지됨 : 액세스가 거부되었습니다. (0) | 2020.12.27 |