2014-02-05 2 views
0

우리는 고도로 실시간 응용 프로그램을 개발 중입니다. 응용 프로그램이 마크까지 수행하지 않습니다. 우리는 약간의 성능 프로파일을했고, 코드의 다음 조각 _chunkSize1024000NonceSize입니다C# 코드 조각의 성능을 개선하기위한 제안

for (int i = 0; i < _chunkSize; i++) 
{ 
    outputData[i] = (byte)(inputText[i]^nonce[i % NonceSize]); 
} 

16 대부분의 시간 소요를 발견했다. inputText, outputDatanoncebyte 어레이입니다.

성능을 개선하기 위해이 조각의 변경을 제안하십시오

편집

더 컨텍스트 줄 -

를 나는 내가의 사용자 지정 .NET 구현을 사용하여 내 자신의 DRM 시스템을 개발했다 CTR 암호화 알고리즘 영화가 재생되는 동안 1MB 청크가 암호화 된 미디어 파일에서 읽혀지고 메모리에서 해독되어 플레이어에게 공급됩니다. 암호 해독이 느리게 실행되므로 플레이어가 더 큰 크기의 영화 (> 300MB)를 재생하지 못합니다. 위 코드의 nonce는 암호화 된 모든 1MB 청크에 대해 런타임에 계산되고이를 해독하기 위해 청크와 XOR됩니다.

+4

여기에서하는 일에 대해 더 많은 정보가 없으면 다른보다 효율적인 접근 방법을 제안하기가 어렵습니다. –

+4

더 나은 하드웨어가 필요합니다. DDR4가 좋습니다. –

+0

그것은'_chunkSize' 그 살인자 - 루프를 통해 1,024,000 반복이야. 루프의 몸체는 빠르지 만, 여전히 많은 시간을 소비 할 곳이 될 것입니다 : 루프 몸체를 최적화하면'_chunkSize'를 줄일 수 있는지 여부를 알 수 있습니다. – J0e3gan

답변

3

나머지 연산자를 사용하여 인덱스를 [0, NonceSize[ 범위로 유지하지 않고 수동으로 대신 수행 할 수 있습니다.

int index = 0; 
for (int i = index; i < _chunkSize; i++, index++) 
{ 
    if(index == NonceSize) 
     index = 0; 
    outputData[i] = (byte)(inputText[i]^nonce[index]); 
} 

약간 도움이 될 것입니다.


결과를보다 적절하게 만들기 위해 _chunkSize을 102400000으로 증가 시켰습니다. 나머지 연산자

1431 1411 1445 1368 1312 1427 1436 1265 1102 1077 
Average: 1327.4 

함께

나머지 연산자없이
1133 1197 1122 973 976 1032 1460 1229 1211 1145 
Average: 1147.8 

없으면 루프는 13.6 % 빨랐다.

+0

* * 측정 된 개선점은 무엇입니까? –

+1

@OndrejTucny 일부 번호를 추가했습니다 – dcastro

+0

+1; 그리고 이제'byte'에서'long'으로 전환합니다 :-) –

관련 문제