네트워크 TCP 프로그램인 경우에 임의 길이의 작은 데이터 조각을 수신해서 누적(버퍼링)시키다가 일정 길이가 수신되면 완전한 하나의 packet으로 보고 해당 데이터를 처리하는 경우가 꼭 필요하다. 지금까지는 그냥 new, calloc 등으로 데이터를 수신할때마다 동적으로 할당해서 기존 데이터를 복사하는 방식으로 해왔는데(동적할당 제거에 의한 성능개선이 크지 않았기에), 이번에 동적 할당없이 사용할 수 있는 버퍼를 구현해 보았다. 일종의 ring buffer 라고도 할수 있다.
https://github.com/jeremyko/CumBuffer
기본 사용법
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include "CumBuffer.h" CumBuffer buffering; if(cumbuffer_defines::OP_RSLT_OK == buffering.Init(9)) //버퍼길이 9 byte로 초기화 { return false; } char data [100]; char dataOut[100]; //3 byte 저장 memset(data, 0x00, sizeof(data)); memcpy(data, (void*)"aaa", 3); if(cumbuffer_defines::OP_RSLT_OK != buffering.Append(3, data)) { return false; } //4 byte 저장 memset(data, 0x00, sizeof(data)); memcpy(data, (void*)"abbb", 4); if(cumbuffer_defines::OP_RSLT_OK != buffering.Append(4, data)) { return false; } if(buffering.GetCumulatedLen()!=7) //현재까지 저장된 데이터 길이 7 { return false; } //4 byte 추출 memset(dataOut, 0x00, sizeof(dataOut)); if(cumbuffer_defines::OP_RSLT_OK != buffering.GetData(4, dataOut)) { return false; } if( strcmp("aaaa", dataOut)!=0) { return false; } //3 byte 추출 memset(dataOut, 0x00, sizeof(dataOut)); if(cumbuffer_defines::OP_RSLT_OK != buffering.GetData(3, dataOut)) { return false; } if( strcmp("bbb", dataOut)!=0) { return false; } |
동적 할당과 비교를 위한 benchmark 소스
https://gist.github.com/jeremyko/5ddd7796da25918962da0f6ad34e02ae
댓글 없음:
댓글 쓰기