Zstd: iOS의 ZSTD-32 λΉ„νŠΈ 정렬이 ν•„μš”ν•©λ‹ˆκΉŒ?

에 λ§Œλ“  2018λ…„ 06μ›” 26일  Β·  3μ½”λ©˜νŠΈ  Β·  좜처: facebook/zstd

μ•ˆλ…•ν•˜μ„Έμš”

첫째, ZSTD에 κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€!

λ‚˜λŠ” ZSTD 1.3.4λ₯Ό ν™œμš©ν•˜λŠ” iOS μ•±μ—μ„œ ν¬λž˜μ…”λ₯Ό μ«“μ•„ μ™”κ³ , μ‚¬μ „μ΄μ—†λŠ” μ»¨ν…μŠ€νŠΈλ‘œ μ••μΆ• ν•  λ•Œ 가끔 MEM_write32μ—μ„œ ν¬λž˜μ‹œκ°€ λ°œμƒν•©λ‹ˆλ‹€.

    NSData* metadata = (snip)
    const size_t expectedCompressionSize = ZSTD_compressBound(metadata.length);

    UInt8* compressionBuffer = malloc(expectedCompressionSize);

    size_t const compressedSize = ZSTD_compressCCtx(compressionContext, compressionBuffer, expectedCompressionSize, metadata.bytes, (size_t) metadata.length, 1);

    // Hit error on compression use ZSTD_getErrorName for error reporting eventually.
    if(ZSTD_isError(compressedSize))
    {
        free(compressionBuffer);
        return nil;
    }

    NSData* zstdCompressedData = [[NSData alloc] initWithBytesNoCopy:compressionBuffer length:compressedSize freeWhenDone:YES];

iOS / Arm에 λ°°ν¬ν•˜κΈ°μœ„ν•œ μ •λ ¬ μš”κ΅¬ μ‚¬ν•­μ΄λ‚˜ λ‰˜μ•™μŠ€κ°€ μžˆμŠ΅λ‹ˆκΉŒ? make νŒŒμΌμ—μ„œ λͺ‡ 가지 align = 32λ₯Ό λ°œκ²¬ν–ˆμ§€λ§Œ iOS 용 λ¬Έμ„œμ—μ„œλŠ” ꡬ체적인 λ‚΄μš©μ„ 보지 λͺ»ν–ˆμŠ΅λ‹ˆλ‹€. νŠΉμ • clang 정렬이 μžˆμŠ΅λ‹ˆκΉŒ?

직렬 λ””μŠ€νŒ¨μΉ˜ νμ—μ„œ ZSTD_compressCCtxλ₯Ό μ‚¬μš©ν•˜λŠ” 것과 κ΄€λ ¨ν•˜μ—¬ λ‰˜μ•™μŠ€κ°€ μžˆμŠ΅λ‹ˆκΉŒ (단일 μŠ€λ ˆλ“œκ°€ μ•„λ‹ˆλΌ λͺ‡ 개의 μ‹œμŠ€ν…œ μŠ€λ ˆλ“œμ—μ„œ μ‚¬μš©ν•  수 μžˆμ§€λ§Œ λ™μ‹œ 적이 지 μ•Šμ€ μ»¨ν…μŠ€νŠΈ μΈμŠ€ν„΄μŠ€μ˜ 보μž₯ 된 직렬 호좜)?

정보 κ°μ‚¬ν•©λ‹ˆλ‹€!

question

λͺ¨λ“  3 λŒ“κΈ€

MEM_write32() 은 (λŠ”) μ—„κ²©ν•œ 정렬이 ν•„μš”ν•œ λŒ€μƒμ„ ν¬ν•¨ν•˜μ—¬ λͺ¨λ“  λŒ€μƒμ—μ„œ μž‘λ™ν•˜λ„λ‘λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€.
ν”ν•˜μ§€ μ•Šμ€ μ €μ „λ ₯ μž₯μΉ˜μ—λŠ” μ•½κ°„μ˜ λ―Έλ¬˜ν•œ μ°¨μ΄κ°€μžˆμ„ 수 μžˆμ§€λ§Œ iOS μž₯치의 경우 λ¬Έμ œκ°€ 없을 κ²ƒμœΌλ‘œ μ˜ˆμƒλ©λ‹ˆλ‹€. κ²Œλ‹€κ°€ λŒ€λΆ€λΆ„μ˜ μ΅œμ‹  iOS μž₯μΉ˜λŠ” λ°μŠ€ν¬ν†± x86 CPU와 같이 μ •λ ¬λ˜μ§€ μ•Šμ€ μ£Όμ†Œμ—μ„œ 읽고 μ“Έ μˆ˜μžˆλŠ” ARM 64 λΉ„νŠΈ νŒŒμƒλ¬Όμ„ μ‚¬μš©ν•©λ‹ˆλ‹€.
λ”°λΌμ„œμ΄ 경우 정렬이 λ¬Έμ œκ°€λœλ‹€λ©΄ 맀우 λ†€λž„ κ²ƒμž…λ‹ˆλ‹€.

또 λ‹€λ₯Έ κ°€λŠ₯성은 MEM_write32() κ°€ μŠΉμΈλ˜μ§€ μ•Šμ€ μ£Όμ†Œμ— μ“°λŠ” κ²ƒμž…λ‹ˆλ‹€.
μ™œ μΌμ–΄λ‚ μ§€λŠ” λΆ„λͺ…ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
ZSTD_compressCCtx() λŠ” 버퍼 μ˜€λ²„ ν”Œλ‘œμš° λŒ€λΉ„ μ•ˆμ „ν•΄μ•Όν•©λ‹ˆλ‹€.

닀쀑 μŠ€λ ˆλ“œ ν™˜κ²½μ—μ„œ μž‘μ—…ν•˜λŠ” 것도 μ–ΈκΈ‰ν•©λ‹ˆλ‹€.
주어진 μ»¨ν…μŠ€νŠΈλŠ” ν•œ λ²ˆμ— ν•˜λ‚˜μ˜ μŠ€λ ˆλ“œμ—μ„œλ§Œ μ‚¬μš©ν•΄μ•Όν•©λ‹ˆλ‹€.
μŠ€λ ˆλ“œλ₯Ό μ „ν™˜ ν•  수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 정말 μ€‘μš”ν•œ 것은 2 개의 μŠ€λ ˆλ“œκ°€ λ™μ‹œμ— μ‚¬μš©ν•΄μ„œλŠ” μ•ˆλœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.
κ·€ν•˜μ˜ κ΅¬ν˜„μ΄μ΄ 쑰건을 μ²˜λ¦¬ν•΄μ•Όν•œλ‹€λŠ” 것을 μ΄ν•΄ν•©λ‹ˆλ‹€.
κ·ΈλŸ¬λ‚˜ λ‚˜λŠ” λ‹€μ‹œ 보도둝 κΆŒν•  κ²ƒμž…λ‹ˆλ‹€.
λ•Œλ‘œλŠ” κ΅¬ν˜„ μ„ΈλΆ€ 사항에 따라 μ΄λŸ¬ν•œ 쑰건을 보μž₯ν•˜κΈ°κ°€ 맀우 μ–΄λ €μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.

μŠ€λ ˆλ“œ μƒˆλ‹ˆ 타이 μ €λ₯Ό μ‚¬μš©ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. 잘λͺ»λœ μ‚¬μš©μ΄μžˆλŠ” 경우 ν”Œλž˜κ·Έλ₯Ό 지정할 수 μžˆμ–΄μ•Όν•©λ‹ˆλ‹€.

ZSTD μ••μΆ• μ»¨ν…μŠ€νŠΈμ— μ•‘μ„ΈμŠ€ν•˜κΈ°μœ„ν•œ WRT μ •λ ¬ 및 μŠ€λ ˆλ”©μ— λŒ€ν•œ μ„€λͺ…에 λŒ€ν•΄ @ Cyan4973 μ—κ²Œ κ°μ‚¬λ“œλ¦½λ‹ˆλ‹€. λ‚˜λŠ” 당신이 μ–ΈκΈ‰ ν•œ κ·œμΉ™μ„ λ”°λ₯Έ λ‹€κ³  λ―ΏλŠ”λ‹€ (λ‹€μ–‘ν•œ μŠ€λ ˆλ“œμ— 걸친 μ—„κ²©ν•˜κ²Œ 직렬 μ•‘μ„ΈμŠ€μ—λŠ” μ•ˆμ „ν•˜μ§€λ§Œ λ™μ‹œ μ•‘μ„ΈμŠ€μ—λŠ” μ ˆλŒ€μ μœΌλ‘œ μ•ˆμ „ν•˜μ§€ μ•ŠμŒ). λ‚˜λŠ” λ˜ν•œ 그것이 μ‚¬μ‹€μž„μ„ 보μž₯ν•˜λŠ” 것이 μ–Όλ§ˆλ‚˜ μ–΄λ €μš΄μ§€ μ•Œκ³  μžˆμŠ΅λ‹ˆλ‹€ :) Apples libDispatch / Grand Central Dispatchλ₯Ό ν†΅ν•œ dispatch_asyncλŠ” μ—„κ²©ν•œ μ€€μˆ˜λ₯Ό ν—ˆμš©ν•΄μ•Όν•˜μ§€λ§Œ μ•„λ§ˆλ„ λ‚΄κ°€ μƒκ°ν•˜λŠ” κ²ƒμ²˜λŸΌ λ§€λ„λŸ½μ§€ μ•Šμ„ κ²ƒμž…λ‹ˆλ‹€ :)

버그가 μ•„λ‹Œ 질문으둜이 문제λ₯Ό μ’…κ²° ν•΄ μ£Όμ‹œκΈ° λ°”λžλ‹ˆλ‹€. 격리 ν•  μˆ˜μžˆλŠ” νŠΉμ • 좩돌 λ™μž‘μ„ μ°Ύκ±°λ‚˜ μΆ”κ°€ μ§ˆλ¬Έμ„ν•˜λŠ” 경우 μƒˆ '버그'λ₯Ό μ œμΆœν•˜κ² μŠ΅λ‹ˆλ‹€.

μ² μ €ν•œ λ‹΅λ³€ κ°μ‚¬ν•©λ‹ˆλ‹€. κ°μ‚¬ν•©λ‹ˆλ‹€!

당신은 직감이 μ™„μ „νžˆ μ£½μ—ˆκ³  μŠ€λ ˆλ”©μ΄ κΉŒλ‹€ λ‘­μŠ΅λ‹ˆλ‹€. μ„Έ 번 ν™•μΈν•˜κΈ° μœ„ν•΄ 엉덩이λ₯Ό κ±·μ–΄μ°¨ μ£Όμ…”μ„œ κ°μ‚¬ν•©λ‹ˆλ‹€.

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰