[ACE] ACE_Hash_Map_With_Allocator性能测试

测试平台: 操作系统solaris 5.8 机器型号Sun-Fire-880
测试方案

     测试将插入50万条记录到使用内存映像文件的HashMap中,并根据下面不同的条件分别测试,看花费的时间和资源使用情况

a.       指定初始文件大小(100M),并做sync操作。

结果: 花费64秒钟,但有时31秒,磁盘和内存占用都是100M的空间 

b.      不做sync操作

 
结果:时间2秒, 磁盘和内存占用都是100M的空间

c.       不指定初始文件大小,不做sync操作。

 
结果: 时间323秒,磁盘和内存占用都是100M的空间
      
d.      指定初始文件大小500M,不做sync操作。  
结果:时间2秒,磁盘和内存占用都是100M的空间,但ls显示文件的大小为500M。
      
结论
 1. 使用ACE_Hash_Map_With_Allocator的时候,如果量大的话,最好
在预先指定初始文件大小,否则,效率会很慢。

2. sync操作会比较耗时

 

另外,在创建HashMap对象的时候也需要将Map的初始大小设大,如10万,否则速度也会很慢()。

在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平台上的测试

 

在Windows上测试,内存资源没有占用。?? 
 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值