์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ˜์‘ํ˜•

 

์ถœ์ฒ˜ : http://www.buggymind.com/83

 

์š”์ฆ˜ C++๋กœ Admission Control System์„ ๊ฐœ๋ฐœ์ค‘์ž…๋‹ˆ๋‹ค. ๊ทผ๋ฐ ํ”„๋กœ๊ทธ๋žจ์„ ์งœ๋‹ค ๋ณด๋ฉด ์œผ๋ก€ ๊ทธ๋ ‡๊ฒ ์ง€๋งŒ ์ŠคํŠธ๋ง์„ ์ˆซ์ž๋กœ, ์ˆซ์ž๋Š” ์ŠคํŠธ๋ง์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ผ์ด ๋งŽ์ด ์ƒ๊ธฐ๋”๊ตฐ์š”. ์ข…์ „์—๋Š” atoll๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ์จ์„œ ๊ทธ๋Ÿฐ ๋ณ€ํ™˜์ž‘์—…์„ ํ•˜๊ณ  ์žˆ์—ˆ๋Š”๋ฐ, ์›ฌ์ง€ ์˜ค๋Š˜์€ stringstream ํด๋ž˜์Šค๋ฅผ ์จ์„œ ๊ทธ๊ฑธ ํ•ด๋ณด๊ณ  ์‹ถ๋”๊ตฐ์š”. ์–ด์ฉŒ๋‹ค๊ฐ€ Bjarne ์„ ์ƒ๋‹˜์˜ ์ด ๊ธ€์„ ๋ณด๊ฒŒ ๋˜์—ˆ๊ฑฐ๋“ ์š”. "How do I convert an Integer to a String"์ด๋ผ๋Š” ๊ฒƒ์ด ์ œ๋ชฉ์ธ๋ฐ์š”. stringstream ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•ด itos๋ผ๋Š” ํ•จ์ˆ˜(integer๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ๋Š”)๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ์ด๋ฒˆ์—๋Š” ๋ฌธ์ž์—ด์„ ์ˆซ์ž๋กœ ๋ฐ”๊พธ๋Š” ์ž‘์—…์„ stringstream์„ ์จ์„œ ํ•ด๋ณด๊ธฐ๋กœ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ์˜ ๋น„์Šทํ•˜๊ฒŒ ํ•˜๋ฉด ๋ ๊ฒƒ ๊ฐ™๋”๊ตฐ์š”.

#include <iostream>
#include <sstream>
using namespace std;
long long stoll(const string& v) {
    stringstream ss;
    ss << v;
    long long ret;
    ss >> ret;
    return ret;
}
int main() {
    long long r;
    for ( int i = 0; i < 10000000; ++i ) {
        r = stoll("48623948209834029");
    }
}

๋„ค. ์ด๋ ‡๊ฒŒ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋Š” ์•„์ฃผ ๊ทธ๋Ÿด์‹ธํ•˜๊ฒŒ ์ž˜ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๋‚˜๋ฆ„๋Œ€๋กœ 'C++'์ ์ด๊ธฐ๋„ ํ•˜์ง€์š”. ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ ์ €๋Š” ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ํฌ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์™œ ๊ทธ๋žฌ๋ƒ๊ณ ์š”? ์œ„์˜ ์ฝ”๋“œ๋ฅผ Unix time ๋ช…๋ น๊ณผ ํ•จ๊ป˜ ์‹คํ–‰ํ•ด๋ณด๋ฉด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.
[bjlee@bjlee-xnote test]$ time ./a.out
real    0m24.972s
user    0m23.349s
sys     0m0.060s
[bjlee@bjlee-xnote test]$

ํ•˜์ง€๋งŒ ๊ฐ™์€ ํ”„๋กœ๊ทธ๋žจ์„ stdlib.h์— ์„ ์–ธ๋˜์–ด ์žˆ๋Š” atoll์„ ์จ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜๋ฉด ์–ด๋–จ๊นŒ์š”?
int main() {
    long long r;
    for ( int i = 0; i < 10000000; ++i ) {
        r = atoll("48623948209834029");
    }
}

๊ทธ๋žฌ์„ ๊ฒฝ์šฐ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป์Šต๋‹ˆ๋‹ค.
[bjlee@bjlee-xnote test]$ time ./a.out
real    0m2.306s
user    0m2.276s
sys     0m0.008s
[bjlee@bjlee-xnote test]$

๊ฐ„๋‹จํ•œ ์‹คํ—˜์œผ๋กœ๋„ ์„ฑ๋Šฅ ์ฐจ์ด๊ฐ€ ๊ฝค ํฌ๋‹ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์ฒด ์ƒ์„ฑ๊ณผ ๊ฐ™์€ ๊ธฐํƒ€๋“ฑ๋“ฑ์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ผ์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์— stringstream์ชฝ์˜ ํผํฌ๋จผ์Šค๊ฐ€ ๋” ์•ˆ์ข‹๊ฒŒ ๋‚˜์˜จ ๊ฒƒ์ด๊ฒ ์ฃ . ๊ทธ๋Ÿผ Bjarne ์•„์ €์”จ๋Š” int๋ฅผ string์ชฝ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ์™œ stringstream์„ ์ถ”์ฒœํ•œ ๊ฒƒ์ผ๊นŒ์š”? ๊ทธ๊ฒŒ ๊ถ๊ธˆํ•ด์„œ ๋ฐ˜๋Œ€์ชฝ๋„ ์‹คํ—˜์„ ํ•ด๋ดค์Šต๋‹ˆ๋‹ค.
#include <iostream>
#include <sstream>
using namespace std;
string itos(const long long& v) {
    stringstream ss;
    ss << v;
    string ret;
    ss >> ret;
    return ret;
}
int main() {
    string p;
    for ( int i = 0; i < 10000000; ++i ) {
        p = itos(324879829);
    }
}

์œ„์˜ ์ฝ”๋“œ์˜ ๊ฒฝ์šฐ time์œผ๋กœ ์‹œ๊ฐ„์„ ์žฌ ๋ณด๋ฉด ๊ฒฐ๊ณผ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
[bjlee@bjlee-xnote test]$ time ./a.out
real    0m19.790s
user    0m19.677s
sys     0m0.012s
[bjlee@bjlee-xnote test]$

๊ทธ๋Ÿผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด๋ฉด ์–ด๋–จ๊นŒ์š”?
#include <iostream>
#include <sstream>
using namespace std;
string itos(const long long& v) {
    char buffer[256];
    sprintf(buffer, "%lld", v);
    return string( buffer );
}
int main() {
    string p;
    for ( int i = 0; i < 10000000; ++i ) {
        p = itos(324879829);
    }
}

์ด ๊ฒฝ์šฐ์˜ ์„ฑ๋Šฅ์„ ์žฌ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
[bjlee@bjlee-xnote test]$ time ./a.out
real    0m7.683s
user    0m7.104s
sys     0m0.032s
[bjlee@bjlee-xnote test]$

์–ด์จŒ๋˜ stringstream์„ ์“ฐ๊ฒŒ ๋˜๋ฉด ์„ฑ๋Šฅ์€ ๋ฐฐ ์ด์ƒ ๋–จ์–ด์ง€๋Š”๊ตฐ์š”.
๊ทธ๋ ‡๋‹ค๋ฉด Bjarne ์•„์ €์”จ๊ฐ€ int๋ฅผ string์œผ๋กœ ๋ณ€ํ™˜ํ•  ๋•Œ stringstream์„ ์“ฐ๋Š”๊ฒŒ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๋‹ค๊ณ  ์ถ”์ฒœํ•œ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? ์ด์œ ๋„ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. string์„ int๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ชฝ์€ ๊ทธ๋Ÿด๋“ฏํ•œ ์†”๋ฃจ์…˜์ด ์ด๋ฏธ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. (atoll์ด๋‚˜ atoi์™€ ๊ฐ™์€) ๊ฑฐ๊ธฐ๋‹ค ์ด๋Ÿฐ ํ•จ์ˆ˜๋“ค์€ '๋” ์ด์ƒ ๊ฐ„๋‹จํ•ด์งˆ ์ˆ˜ ์—†์„ ์ •๋„๋กœ' ๋‹จ์ˆœํ•œ ํ•จ์ˆ˜๋“ค์ด์–ด์„œ, ๊ทธ ํ•จ์ˆ˜๊ฐ€ '๊ทธ๋‹ค์ง€ ์šฐ์•„ํ•ด๋ณด์ด์ง€ ์•Š๋Š”๋‹ค๋Š” ์ด์œ ๋กœ' C++์ ์ธ ํ•ด๊ฒฐ์ฑ…์„ ๊ณ ์•ˆํ•ด ๋‚ธ๋‹ค๋Š” ๊ฒƒ์ด ๋ง์ด ๋˜์งˆ ์•Š์•„์š”. ๋ฐฉ๊ธˆ ์œ„์—์„œ ์‹คํ—˜ํ•œ ๊ฒฐ๊ณผ๋กœ๋„ ์ฆ๋ช…๋˜๋Š” ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค๋งŒ, ์„ฑ๋Šฅ๋„ ๋” ํ˜•ํŽธ์—†์–ด์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์ฃ .
๋ฐ˜๋ฉด int๋ฅผ string์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„๋ณด๋ฉด, ๊ทธ๋‹ค์ง€ ๊ฐ„๋‹จํ•œ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์„ ํ˜ธํ•˜๋Š” ๋ฐฉ๋ฒ•์€ (์œ„์˜ ์˜ˆ์ œ ์ฝ”๋“œ์—์„œ๋„ ์จ๋จน์—ˆ์Šต๋‹ˆ๋‹ค๋งŒ) sprintf๋ฅผ ์“ฐ๋Š” ๊ฒƒ์ธ๋ฐ, ๊ทธ๊ฒƒ๋„ ๋ฒ„ํผ๋ฅผ ์žก๋Š” ๋“ฑ์˜ ์‚ฌ์ „ ์ž‘์—…์ด ํ•„์š”ํ•˜๋‹ˆ๊นŒ ๊ทธ๋ ‡๊ฒŒ ํŽธํ•˜์ง€๋Š” ์•Š์•„์š”. ๊ทธ๋Ÿฌ๋‹ˆ ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ์—๋Š” 'stringstream'์„ ์“ฐ๋Š”๊ฒŒ ๋‚˜์„ ์ˆ˜๋„ ์žˆ๊ฒ ์ฃ . Bjarne์˜ ๋ง์ฒ˜๋Ÿผ, '๊ฐ„๋‹จํ•จ'์ด๋ผ๋Š” ๊ฒฌ์ง€์—์„œ ๋ณด๋ฉด ๋ง์ด์—์š”. ๊ฑฐ๊ธฐ๋‹ค stringstream ํด๋ž˜์Šค ์•ˆ์—๋Š” ์˜ค๋งŒ๊ฐ€์ง€ ๋ฐ์ดํ„ฐํƒ€์ž…์„ ๋‹ค ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์˜ค๋ฒ„๋กœ๋”ฉ๋œ ์—ฐ์‚ฐ์ž๋“ค์ด ์ž”๋œฉ ๊ตฌํ˜„๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„ฑ๋Šฅ์€ ์•ˆ์ข‹์„์ง€ ๋ชฐ๋ผ๋„, "%lld๊ฐ™์€ ์˜ต์…˜์„ ์ „๋ถ€ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์ง€ ์•Š์•„๋„ ๊ตฌํ˜„์„ ํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ, ํŽธํ•˜๋‹ค๋Š” ๊ฒƒ์ด์ฃ . (๊ฑฐ๊ธฐ๋‹ค template์„ ์„ž์–ด์“ฐ๋ฉด ์•„๋งˆ ๋” ํŽธํ•ด์งˆ๊ฒ๋‹ˆ๋‹ค ใ…‹ใ…‹)
๊ทธ๋ ‡๋‹ค๋ฉด ์˜ค๋Š˜์˜ ๊ฒฐ๋ก ์€...
  • int -> string ๋ณ€ํ™˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” stringstream์„ ์“ฐ๋Š” ๊ฒƒ์ด '๊ฐ„๋‹จํ•˜'๋‹ค.
  • ๋ฐ˜๋Œ€์˜ ๋ณ€ํ™˜์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋Š” stringstream์„ ์จ ๋ด์•ผ ์ฝ”๋“œ๊ฐ€ ๊ฐ„๋‹จํ•ด ์ง€์ง€ ์•Š๋Š”๋‹ค
  • ๋‘ ๊ฐ€์ง€ ๊ฒฝ์šฐ ๋ชจ๋‘, C API๋ฅผ ์“ฐ๋Š” ๊ฒƒ์— ๋น„ํ•ด์„œ๋Š” ์„ฑ๋Šฅ์ด ๊ต‰์žฅํžˆ ๋–จ์–ด์ง„๋‹ค

์„ฑ๋Šฅ์ด ๊ฑฑ์ •๋˜์‹ ๋‹ค๋ฉด ๋ญ๋‹ˆ๋ญ๋‹ˆ ํ•ด๋„ C API์ชฝ์ด ๋‚ซ๊ฒ ์–ด์š”.
๋ฐ˜์‘ํ˜•

+ Recent posts