์ด์ ๋ ์ด๋ด ํ์๋ ์์ ๊ฒ ๊ฐ์๋ฐ ๊ทธ๋ ๊ทธ ์์ ์ ์ ์ด๋ฐ ๊ฑฐ์ ์๋ฏผํ๋์ง ใ ใ ใ
๋คํธ์ํฌ ํ๋ก๊ทธ๋จ ์ ์ํ ๋,
#include <winsock2.h>๋ฅผ ์ด์ฉํด์
y = htons(x); ๋
y = htonl(x);๋ฅผ
์ฌ์ฉํ๋๋ฐ, ์ ๊ฒ ์ผ๋ง๋ ๋๋ฆฐ ๊ฑธ๊น? ํ ๋ฒ ์๊ฐํด๋ดค๋ค.
/* Using Winsock2 normaly */
#include <iostream>
#include <winsock2.h>
using namespace std;
int main()
{
unsigned short x = 0x3399;
unsigned short y;
unsigned int a = 0xff0102ff;
unsigned int b;
cout << "using winsock2" << hex << endl;
for(int i=0;i<1000000000;i++)
y = htons(x);
cout << "x = " << x << "y = " << y << endl;
for(int i=0;i<1000000000;i++)
b = htonl(a);
cout << "a = " << a << "b = " << b << endl;
return 0;
}
๊ทธ๋์ ์ผ๋จ ํ ์คํธ๋ก asm ์ฝ๋๋ฅผ ์ด์ฉํด์ htons์ htonl์ ๊ตฌํํ๋ค.
asm ์ฝ๋๋ ์ธํฐ๋ท์์ ๊ฒ์ํ๋ฉด ibm์ด๋ joinc๋ ๋ธ๋ก๊ทธ๋ ์ฌ๋ฌ๊ณณ์์ ๋ํ๋๋ค.
C๋ก ๋ ๋ง์คํน ์ฒ๋ฆฌํด์ ์ฌํํฐ ์ฐ์ฐํ๋ ๊ฒ๋ ์๋๋ฐ ๊ทธ๊ฑด ์๋๊ฐ ๋๋ฆด๊ฑฐ๊ณ ...
ํ๋์ฝ๋ ํ ์คํธ ๊ฒฐ๊ณผ๋ ๋ฌด์ง ์ฐจ์ด๊ฐ ๋ฌ๋ค.
๊ฒฐ๊ณผ๋ ASM์ฝ๋์ ์น๋ฆฌ! (๋น์ฐํ๊ฑด๊ฐ... ์ปดํ์ผ๋ ํฌ๊ธฐ๋ 84๋ฐ์ดํธ ์ ๋ค.)
๋ฌผ๋ก ์ด๋ฐ ๊ฒฐ๊ณผ๊ฐ ๋์จ๊ฑด ๋ด๊ฐ ์ฐ๋ ์ปดํ์ผ๋ฌ๊ฐ MingW๋ผ์ ์ผ ์๋ ์๋ค.
Visual C์์ ์ปดํ์ผํ๋ฉด ์ต์ ํ๋์ ์๋์ฐจ์ด๊ฐ ์๋๊ฑฐ๋ ๋ ๋น ๋ฅผ ์๋ ์๋ค. (ํ์ธ๋ถ๊ฐ)
๊ตฌ๋ถ | 1์ตํ ๊ณ์ฐ | 10์ตํ ๊ณ์ฐ |
ASM์ฝ๋ | 0.687s | 6.761s |
winsock2 | 1.374s | 13.070s |
ํ์ง๋ง ํจ์ํํ๋ก ๋ฐ๊พธ๋๊น๋ณ๋ก ์ฐจ์ด๊ฐ ๋์ง ์์๋ค.
๊ทธ๋์ ํจ์ ํํ๋ก ์จ๋ณผ๋ ค๊ณ ...ํ๋๋ ์ฐจ์ด๊ฐ ๋์ง ์์๋ค.
๋ผ๋ ์๊ธฐ๋ winsock2๋ asm ์ฝ๋๋ ๊ฐ์ ๊ฑฐ๊ฒ ์ง.
๊ตฌ๋ถ | 1์ตํ ๊ณ์ฐ | 10์ตํ ๊ณ์ฐ |
ASM์ฝ๋ | 1.325s | 13.491s |
winsock2 | 1.374s | 13.179s |
#define๋ฌธ ์ฌ์ฉํด์ ์ฌ์ ์ํ fastHtons & fastHtonl
๊ฒฐ๊ตญ์ #define์ผ๋ก, ์ด๋ ๊ฒ ํ๋ฉด ์์ค ์ค๊ฐ์ ๋ค์ด๊ฐ๊ฒ ๋๋๊น ํจ์ ํธ์ถ์ด ์์ด์ง๊ณ ์๋๊ฐ ๋นจ๋ผ์ง๋ค.
๋์ ์ฉ๋์ด fastHtonX์ ์ฌ์ฉ ํ์ ๋งํผ ๋์ด๋๋ค. ๊ทธ๋๋ดค์ ๋ช๋ฒ ์ ์ฐ์๋...ใ
๊ตฌ๋ถ | 1์ตํ ๊ณ์ฐ | 10์ตํ ๊ณ์ฐ |
ASM์ฝ๋ | 0.687s | 6.761s |
winsock2 | 1.374s | 13.070s |
๋น ๋ฅธ ๋ฐ์ดํธ ์ค๋ ์์ค์ฝ๋
FastByteOrder.cc
/* fast byte order */
#include <iostream>
using namespace std;
#define fastNtohl fastHtonl
#define fastNtohs fastHtons
#define fastHtons(in, out) \
asm ("movw %1, %%ax;"\
"xchg %%ah, %%al;"\
"movw %%ax, %0;"\
:"=r"(out)\
:"r"(in)\
:"%ax","%ah","%al");
#define fastHtonl(in, out) \
asm ("movl %1, %%eax;"\
"bswap %%eax;"\
"movl %%eax, %0;"\
:"=r"(out)\
:"r"(in)\
:"%eax");
int main()
{
unsigned short x = 0x3399;
unsigned short y;
unsigned int a = 0xff0102ff;
unsigned int b;
cout << "fast byte order" << hex << endl;
for(int i=0;i<1000000000;i++)
fastHtons(x, y);
cout << "x = " << x << "y = " << y << endl;
for(int i=0;i<1000000000;i++)
fastHtonl(a, b);
cout << "a = " << a << "b = " << b << endl;
return 0;
}
์ ๋ ์์ค์ฝ๋์ ์คํ ์๋ ์ฐจ์ด ๋น๊ต
์ผ์ชฝ : Winsock2.h : 13.429s
์ค๋ฅธ์ชฝ : Fast Byte Order : 6.745s
๋ค๋ฅธ ์ฌ๋๋ค์ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๋ ์์ผ๋ก ์ด๊ฑธ ์ธ๊ฑฐ๋ค. ๊ทธ๋ฆฌ๊ณ ์ฝ๋ฉ ๋ฐฉ์๋ ํจ์ ํธ์ถ์ ์ค์ด๊ณ , ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ๊ณฑํ๊ธฐ๋ ์ค์ด๊ณ , ์์ ํ๋์ฝ๋ฉ์ผ๋ก ใ ใ ใ
๋ผ๊ณ ์๊ฐํด๋ดค์ง๋ง, ๊ทธ๊ฑด ์ฝ๋๊ฐ 100์ค ์ดํ์ผ ๋๋... ๊ฒฐ๊ตญ์ ๊ฐ์ฒด ์ค๊ณ ๋ฐฉ์์ผ๋ก ๋ง๋ค๊ฒ ๋๊ฒ ์ง...
๊ฒ๋ค๊ฐ #define macro์ ๋จ์ ์ธ... ์ฌ๋ฌ ์ค๋ก ์์ฑํ ๊ฒฝ์ฐ ๋์ ํ ๋๋ฒ๊น ํ ์ ์๋ ์ฌํ๊ฐ ๋ฐ์ํ๋ฉด ๊ทธ๊ฑธ๋ก ์ฌ๋ง์ด๋ค. ใ ใ ใ (๋ฌผ๋ก ํ์ค๋ก ๋ฐ๊พธ๋ฉด ํด๊ฒฐ ๋จ-_ -;)
ํน์ ๋ด๊ฐ ์คํดํ ๊ฑด๊ฐ ์ถ์ด์ ํ๋ฒ ๋ ํ์ธํด๋ด.
๋๋ฒ๊น ๋ชจ๋๋ ๋ฆด๋ฆฌ์ฆ ๋ชจ๋๊ฐ ์๋๋ผ? ๊ทธ๋์ ๋ค์ ํ ์คํธ ํด๋ดค๋ค. ใ ใ ใ
1์ฐจ๋ ์ ๋ถ ์ฒซ ์ปดํ์ผ ํ ์คํ, 2์ฐจ๋ 1์ฐจ ์ข ๋ฃ ํ ์คํ, 3์ฐจ๋ 2์ฐจ ์ข ๋ฃ ํ ์คํ.
byte order by (asm)
๊ตฌ๋ถ | Debug๋ชจ๋ | Release๋ชจ๋ |
ํฌ๊ธฐ | 604,188B | 276,480B |
1์ฐจ | 8.796s | 2.546s |
2์ฐจ | 8.750s | 2.500s |
3์ฐจ | 8.750s | 2.484s |
byte order by (masking & shift)
๊ตฌ๋ถ | Debug๋ชจ๋ | Release๋ชจ๋ |
ํฌ๊ธฐ | 1,322,981B | 276,480B |
1์ฐจ | 9.656s | 3.953s |
2์ฐจ | 9.609s | 3.906s |
3์ฐจ | 9.593s | 3.906s |
byte order by (winsock2)
๊ตฌ๋ถ | Debug๋ชจ๋ | Release๋ชจ๋ |
ํฌ๊ธฐ | 604,188B | 276,480B |
1์ฐจ | 13.296s | 8.984s |
2์ฐจ | 13.046s | 8.968s |
3์ฐจ | 13.062s | 8.953s |
byte order by (asm function)
๊ตฌ๋ถ | Debug๋ชจ๋ | Release๋ชจ๋ |
ํฌ๊ธฐ | 604,254B | 276,480B |
1์ฐจ | 13.296s | 6.421s |
2์ฐจ | 13.250s | 6.375s |
3์ฐจ | 13.250s | 6.375s |
์์ธ๋ก ๋ง์คํน & ์ฌํํธ๋ ๋น ๋ฅด๊ตฌ๋! ๊ทธ๋ฆฌ๊ณ ํจ์๋ก ๋ฐ๊ฟ์ ์ฐ๋ฉด winsock2๋ ๋น์ทํ๋ฐ ์กฐ๊ธ ๋น ๋ฅด๊ธด ํ์ง๋ง 10์ต๋ฒ ํ ์คํธ๋๊น ์๋ฏธ๊ฐ ์๋ ์ถ๊ธฐ๋?
'๊ฒ์ ํ๋ก๊ทธ๋๋ฐ > ๋คํธ์ํฌ ํ๋ก๊ทธ๋๋ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๋ธ๋ฒํผ๋์ํํ VS ์ํํ (0) | 2021.02.03 |
---|---|
Double Buffered Circular Queue๋ก ํจํท ์ฃผ๊ณ ๋ฐ๊ธฐ 2 (0) | 2021.02.03 |
Double Buffered Circular Queue๋ก ํจํท ์ฃผ๊ณ ๋ฐ๊ธฐ 1 (0) | 2021.02.03 |
๋๋ธ ๋ฒํผ๋ง๊ณผ ์ํ ๋ฒํผ๋ง ์์ (Double Buffering and Circular Buffering Examples) (0) | 2021.02.03 |
์ ํ ๋ฉํฐ ์ฐ๋ ๋ ์์ฝ ์๋ฒ (0) | 2021.02.02 |