Skip to content

Commit

Permalink
grep 処理速度改善
Browse files Browse the repository at this point in the history
CMemory の _AppendSz と AppendRawData でメモリ再確保サイズを倍々にして再確保頻度を減らす対応
  • Loading branch information
beru committed Jun 11, 2018
1 parent 4fa304e commit 282b7b2
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 9 deletions.
24 changes: 15 additions & 9 deletions sakura_core/mem/CMemory.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -312,10 +312,6 @@ void CMemory::AllocBuffer( int nNewDataLen )
}else{
/* 現在のバッファサイズより大きくなった場合のみ再確保する */
if( m_nDataBufSize < nWorkLen ){
// 頻繁な再確保を行わないようにする為、必要量の倍のサイズを確保する
if (nWorkLen < std::numeric_limits<int>::max() / 2) {
nWorkLen *= 2;
}
// 2014.06.25 有効データ長が0の場合はfree & malloc
if( m_nRawLen == 0 ){
free( m_pRawData );
Expand Down Expand Up @@ -399,7 +395,7 @@ void CMemory::SetRawDataHoldBuffer( const CMemory& pcmemData )
void CMemory::AppendRawData( const void* pData, int nDataLenBytes )
{
if(nDataLenBytes<=0)return;
AllocBuffer( m_nRawLen + nDataLenBytes );
_ReallocIfNeeded( nDataLenBytes );

This comment has been minimized.

Copy link
@berryzplus

berryzplus Jun 11, 2018

Contributor

ここの意味変わっていませんか?

This comment has been minimized.

Copy link
@beru

beru Jun 12, 2018

Author Contributor

処理内容は元のままではなく変わってしまいます。CGrepAgent の変更箇所だけでも多くて CMemory も変えてしまうと更に影響が読み切れないのは確かなので CMemory の変更はアドバイスに従って行わないようにしました。

なお、元のコードの CMemory::AllocBuffer() に渡している引数 m_nRawLen + nDataLenBytes有効データ長 + 末尾追加データ長CMemory::AllocBuffer() の実装内部においては確保済みのバッファサイズでは収まらない場合に再確保するようになっています。

自分が追加した CMemory::_ReallocIfNeeded() に渡す引数は末尾追加データ長のみで、実装内部で色々やっていますがそれでも結局不完全なのは @ds14050 さんからコメント頂いた通りですね。

_AddData( pData, nDataLenBytes );
}

Expand All @@ -412,7 +408,7 @@ void CMemory::AppendRawData( const CMemory* pcmemData )
}
int nDataLen;
const void* pData = pcmemData->GetRawPtr( &nDataLen );
AllocBuffer( m_nRawLen + nDataLen );
_ReallocIfNeeded( nDataLen );
_AddData( pData, nDataLen );
}

Expand All @@ -425,12 +421,10 @@ void CMemory::_Empty( void )
return;
}



void CMemory::_AppendSz(const char* str)
{
int len=strlen(str);
AllocBuffer( m_nRawLen + len );
_ReallocIfNeeded(len);
_AddData(str,len);
}

Expand All @@ -443,3 +437,15 @@ void CMemory::_SetRawLength(int nLength)
m_pRawData[m_nRawLen ]=0;
m_pRawData[m_nRawLen+1]=0; //終端'\0'を2つ付加する('\0''\0'==L'\0')。
}

void CMemory::_ReallocIfNeeded(int appendLength)
{
assert(appendLength >= 0);
if(m_nDataBufSize - 2 - m_nRawLen < appendLength) {
int64_t newSize1 = (int64_t)m_nRawLen + 2 + appendLength;
int64_t newSize2 = (int64_t)m_nDataBufSize * 2;
int64_t newSize = std::min(std::max(newSize1, newSize2), (int64_t)std::numeric_limits<int>::max());
AllocBuffer( (int)newSize );
}
}

1 change: 1 addition & 0 deletions sakura_core/mem/CMemory.h
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,7 @@ class CMemory
*/
void _Empty( void ); //!< 解放する。m_pRawDataはNULLになる。
void _AddData( const void*, int );
void _ReallocIfNeeded(int appendLength);

This comment has been minimized.

Copy link
@berryzplus

berryzplus Jun 11, 2018

Contributor

メモリサイズを表す変数は、今後size_t/ptrdiff_tとしたいです。

This comment has been minimized.

Copy link
@beru

beru Jun 12, 2018

Author Contributor

同意です。サクラエディタのコード量は結構大きいので大変ですね。

public:
void _AppendSz(const char* str);
void _SetRawLength(int nLength);
Expand Down

0 comments on commit 282b7b2

Please sign in to comment.