测试将插入50万条记录到使用内存映像文件的HashMap中,并根据下面不同的条件分别测试,看花费的时间和资源使用情况
a. 指定初始文件大小(100M),并做sync操作。
b. 不做sync操作
c. 不指定初始文件大小,不做sync操作。
2. sync操作会比较耗时
在solairs上,可以使用内存映像方式的HashMap保存一些持久性的数据,如果可靠性不要求很高,不做文件同步操作(sync),可以获得比较高的效率。这样做的威胁是机器故障或操作系统重新启动会丢失数据。
测试代码
#include "ace/Hash_Map_With_Allocator_T.h"
#include "ace/Malloc_T.h"
#include "ace/PI_Malloc.h"
#include "ace/Process_Mutex.h"
#include "ace/Process.h"
#define BACKING_STORE "map.store"
#define MAP_NAME "records.db"
class Record;
typedef ACE_Malloc<ACE_MMAP_MEMORY_POOL, ACE_Null_Mutex> MALLOC;
typedef ACE_Allocator_Adapter<MALLOC> ALLOCATOR;
typedef ACE_Hash_Map_With_Allocator<int, Record> MAP;
class Record
{
public:
Record () { }
~Record () { }
Record (int id1, int id2, char *name)
: id1_(id1), id2_(id2)
{
ACE_OS::strcpy (recName_, name);
}
char * name (void) { return recName_; }
int id1 (void) { return id1_; }
int id2 (void) { return id2_; }
private:
int id1_;
int id2_;
char recName_[128];
};
MAP* smap (ALLOCATOR *shmem_allocator)
{
void *db = 0;
if (shmem_allocator->find (MAP_NAME, db) == 0)
return (MAP *) db;
size_t hash_table_size = sizeof (MAP);
void *hash_map = shmem_allocator->malloc
(hash_table_size);
if (hash_map == 0)
return 0;
new (hash_map) MAP (100000,
shmem_allocator);
if (shmem_allocator->bind (MAP_NAME, hash_map) ==
-1)
{
ACE_ERROR ((LM_ERROR, ACE_TEXT ("%p/n"),
ACE_TEXT ("allocate_map")));
shmem_allocator->remove ();
return 0;
}
return (MAP*)hash_map;
}
int addRecords(MAP *map, ALLOCATOR *shmem_allocator)
{
ACE_TRACE (ACE_TEXT ("::addRecords"));
char buf[32];
//插入50万条记录
for (int i = 0; i < 500000; i++)
{
ACE_OS::sprintf (buf, "%s:%d", "Record", i);
// Allocate new record on stack;
Record newRecord (i, i+1, buf);
int result = map->bind (i, newRecord,
shmem_allocator);
if (result == -1)
ACE_ERROR_RETURN ((LM_ERROR, ACE_TEXT
("%p/n"),
ACE_TEXT ("bind failed")),
-1);
}
return 0;
}
int ACE_TMAIN (int argc, ACE_TCHAR *argv[])
{
ALLOCATOR * shmem_allocator = 0;
ACE_MMAP_Memory_Pool_Options options
(ACE_DEFAULT_BASE_ADDR,
ACE_MMAP_Memory_Pool_Options::ALWAYS_FIXED);//,0,30*1024*1024);
//指定文件大小
// ACE_MMAP_Memory_Pool_Options options
// (ACE_DEFAULT_BASE_ADDR,
// ACE_MMAP_Memory_Pool_Options::ALWAYS_FIXED,0,100*1024*1024);
ACE_NEW_RETURN
(shmem_allocator,
ALLOCATOR (BACKING_STORE, BACKING_STORE,
&options),
-1);
MAP *map = smap (shmem_allocator);
int begin = time(0);
addRecords (map, shmem_allocator);
//同步文件操作
// shmem_allocator->sync();
int end = time(0);
ACE_DEBUG ((LM_DEBUG,
ACE_TEXT (" %d seconds/n"),
(end - begin)));
return 0;
}
在Windows上测试,内存资源没有占用。??