기본 콘텐츠로 건너뛰기

느린 GNU std::string

신이 내린 축복이라 생각했던 std::string. 삭막하던 C/C++에 string이란 타입을 선사해주신 SGI에게 감사하고 있었다. 가변길이 string. 생각만 해도 아힝~*이 절로 나온다.

그러나...

씨밤. 상당히 평범한 상황에서 그냥 char[]을 쓰는 것보다 느리다. 그도 그럴 것이, assign에서 Allocator를 돌리기 때문이다. 예를 보자.

void
testChar(const char* data)
{
    char field[10][1024+1];
    // data를 ' '로 파싱해서 field에 strncpy함. (귀찮아서 패스)
}

void
testString(const char* data)
{
    string field[10];
    // data를 ' '로 파싱해서 field에 assign(ptr+pos, length)함. (귀찮아서 패스)
}

뭐, 대충 이런 코드가 있다고 치자. 위 함수들을 상당히 큰 수만큼 돌렸다고 치자. 퍼포먼스는 얼마 정도 될까? 자료를 전부 공개할 수 없다는 점은 대충 이해하시라. (아니면 만들어서 돌려보시던가) 약 3.5배 정도 string이 느리다. 그도 그럴 것이 char는 (1024+1)*10을 미리 stack에 잡아놓고 call을 호출한다. 그러나 string은 string이라는 instance만 stack에 쌓여 있고, 실제 메모리는 data를 파싱하여 assign하는 동안 내부적으로 new(malloc)을 호출하여 heap에 메모리 덩어리를 할당받는다. 이게 위에서 stack 지랄하는 것보다 훨씬 느리다. testString에서 for문을 하나 더 넣어서 파싱하기 전에 field에 reserve(1024+1)을 하면 빨라질까? 아쉽게도 더 느려진다. 실험에서는 거의 2배가 넘게 느려졌다.

안습인데?! -_-

더욱 날 경악케 하는 것은 string[] 대신에 vector<string>에 push_back을 했을 경우는 string[]에 비해 2배가 조금 못 되게 느려졌다. (당연하겠지만!)

... 그래도 난 std::string을 사랑한다. 어흑!

댓글

이 블로그의 인기 게시물

버즈 라이브 배터리 교체

나는 버즈 라이브(SM-R180)가 좋은데, 평가가 별루였는지, 해당 스타일로 버즈를 더 이상 만들지 않고 있다. 아무튼, 오래 쓴 버즈 라이브 배터리가 슬슬 맛이 가기 시작해서, 블로그 를 참조하면서 분해 및 교체를 하였다. (진짜 쉬움) 요로코롬 위아래를 살짝 눌러주면 뚜껑이 벌어진다. 안쪽 플라스틱은 오른쪽은 분홍색, 왼쪽은 회색이다. 리본 케이블 살짝 들어내고, 기판을 떼어내면, 작은 나사가 있다. 나사를 풀고, 플라스틱을 걷어내면, 검은 양면 테이프로 고정된 CR1254 배터리가 보인다. 잘 쑤셔서(?) 꺼낸다. 새로운 CR1254 배터리를 넣는다. 음극이 아래로 가도록 하고, 분해의 역순으로 조립하면 된다. 조립할 때, 아까 풀었던 나사는 잊지 말고 꼭 조여준다. (까먹고 조립해서 다시 뜯고 조립함) 충전도 잘 되고, 소리도 잘 나는거 보면, 조립도 잘 된 것 같다. 이렇게 버즈 라이브의 수명을 강제로 늘렸다. 나중에 본체 배터리도 갈아야겠다.

Windows 에서 절전을 깨우는 장치 찾기

참조:  https://www.reddit.com/r/computer/comments/wquswv/windows_11_pc_wakes_up_every_time_i_move_usb/ powercfg /devicequery wake_armed powercfg /deviceenablewake "[DEVICE]" # $PROFILE function Get-WakeArmedDevices { $devices = powercfg -devicequery wake_armed if ($devices) { $devices | ForEach-Object { $_.Trim() } } else { Write-Host "No devices are currently armed for wake events." } } function Set-EnableWakeOnDevice { param( [string]$deviceName ) sudo powercfg -deviceenablewake $deviceName } function Set-DisableWakeOnDevice { param( [string]$deviceName ) sudo powercfg -devicedisablewake $deviceName }