์ด ํฌ์คํ ์ ์ฟ ํก ํํธ๋์ค ํ๋์ ์ผํ์ผ๋ก, ์ด์ ๋ฐ๋ฅธ ์ผ์ ์ก์ ์์๋ฃ๋ฅผ ์ ๊ณต๋ฐ์ ์ ์์ต๋๋ค.
์ถ์ฒ : 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์ชฝ์ด ๋ซ๊ฒ ์ด์.