source

이 이미지 처리 테스트에서 Swift가 C보다 100배 느린 이유는 무엇입니까?

factcode 2022. 8. 14. 11:54
반응형

이 이미지 처리 테스트에서 Swift가 C보다 100배 느린 이유는 무엇입니까?

다른 많은 개발자들처럼 나도 애플의 새로운 스위프트 언어에 매우 흥분해 왔다.애플은 자사의 속도가 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가 1프레임을 처리하는데 필요합니다.

$ time ./test
real    0m0.010s
user    0m0.006s
sys     0m0.003s

그리고 같은 코드의 Swift 버전이 있습니다.

test.filename:

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

즉, Swift는 1프레임 처리에 최대 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

업데이트: 다른 실행 반복으로 더 많은 결과:

다른 수의 "프레임"에 대한 결과는 다음과 같습니다. 즉, 메인 변경for루프 번호를 10에서 다른 번호로 변경합니다.Swift 시간은 크게 변하지 않는 반면 C 코드 시간은 더 빨라지고 있습니다.

             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'가 도움이 됩니다.

와 함께-Ofast@mweathers가 제안하는 스위프트 속도는 합리적인 범위까지 올라갑니다.

내 노트북에서는 Swift 버전이-Ofast는 10프레임의 경우 0.013초, 100프레임의 경우 0.048초로 C 퍼포먼스의 절반에 가깝습니다.

다음을 포함한 구축:

xcrun swift -Ofast test.swift -o test

다음 정보를 얻을 수 있습니다.

real    0m0.052s
user    0m0.009s
sys 0m0.005s

"Why"로 시작하는 질문에 대한 답변에 집중해 봅시다. 왜냐하면 당신은 최적화를 켜지 않았고 Swift는 컴파일러 최적화에 크게 의존하고 있기 때문입니다.

그렇다고는 해도, C로 화상 처리를 하는 것은 정말 바보 같은 짓입니다.그래서 CGImage와 친구들이 있는 거죠.

언급URL : https://stackoverflow.com/questions/24102609/why-swift-is-100-times-slower-than-c-in-this-image-processing-test

반응형