hotfox使用Hoard

原创 2013年12月05日 00:51:35

1.关于Hoard

Hoard是一款快速,高效利用内存的的内存分配器,可以提高应用的运行速度.而且不需要修改应用代码.
Hoard is a fast, scalable, and memory-efficient memory allocator that can speed up your applications. It’s much faster than built-in system allocators:as much as 2.5x faster than Linux, 3x faster than Windows, and 7x faster than Mac. No source code changes necessary. Cross-platform: works on Linux,Solaris, Mac OS X, and Windows.

.官方站点
http://www.hoard.org/
.如何编译与使用的文档
http://people.cs.umass.edu/~emery/hoard/building.html

使用的目的:
.提高内存分配速度:减少UMX消息包的处理时间(如生成时间)
.提高内存使用效率: 降低应用对内存峰值的要求(减少系统内存碎片)

2.编译Hoard(的经历)


Hoard代码的目录为$(HOARDSRC)
cd $(HOARDSRC)
192.168.1.160上同时有vc6和vs2005的环境,系统环境变量默认情况下是使用vc6.
cl版本为:
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.

现在需要在vs2005下编译Hoard.cl版本为:
$(VSINSTALLDIR)>cl
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
Copyright (C) Microsoft Corporation.  All rights reserved.

以下确保使用vs2005编译.
set path=C:\Program Files\Microsoft Visual Studio 8\VC\bin;%path%
set lib=C:\Program Files\Microsoft Visual Studio 8\vc\lib;%lib%
set include=C:\Program Files\Microsoft Visual Studio 8\vc\include;%include%
set path=C:\Program Files\Microsoft Visual Studio 8\Common7\IDE;%path%

否则,会出现编译链接错误.(具体错误略)
如果不设置path,则cl会提示"没有mspdb80.dll".该文件位于$(VSINSTALLDIR)\Common7\IDE目录中.

编译hoard
compile-winhoard.cmd

编译成功后在$(HOARDSRC)目录下生成以下所需的文件:

.winhoard.dll

.winhoard.lib

.usewinhoard.obj

3.编译hotfox


先要编译ACE 5.4,Xerces-C 2.8的Release版本.(zlib,openssl已经编译)

.hotfox Release版本配置
配置名称:32_END_POINT_Release
输出文件:.\bin\hotfox.exe

.使用Hoard的hotfox版本
配置名称:use_hoard_release
输出文件:.\bin/use_hoard_hotfox.exe
附加依赖项:usewinhoard.obj winhoard.lib

4.测试及结论

4.1测试

使用xbox插件对Hoard的使用情况进行对比测试.
简单的测试逻辑:
测试得到生成相同的UMX消息包,对比时间及所需要的内存的数据。(测试数据为24列,500000条记录)

xbox测试代码如下:
int CXboxPlugin::Test3() {
    int k = 0;
    do {
        clock_t begin = clock();
        CMsg *msg = new CMsg;
    CRowset *prs = new CRowset;
        msg->AddRowset(prs);
        int fld_num = 24;
        int rec_num = 500000;
        for (int i=0;i<fld_num;i++) {
            char col_name[32];
            sprintf(col_name,"col%d",i+1);
            prs->AddField(col_name);
        }

        for (int i=0;i<rec_num;i++) {

            char value[] = "ddddddd";
            prs->AddRecord();
            for (int col=0;col<fld_num;col++) {
            prs->SetFieldValue(col,value);
            }
        }

        double duration = (double)(clock()-begin)/CLOCKS_PER_SEC;
        nlogger_->log(LO_STDOUT|LO_FILE,SEVERITY_INFO,"%d:耗时:%.2f秒.\n",k,duration);
        k++;
        if (k>1000)
            break;
        msg->Release();
    }while (1);

    return 0;
}

$(BIN)="..\..\..\..\可执行文件\服务端"

首先需要编译lssdk的Release版本.(lssdk又依赖Xalan-C).

lssdk Release的工程属性:

.输出文件:.$(BIN)\release\lssdk.dll

.导入库:..\..\lib\release\lssdk.lib

.忽略特性库:msvcrtd.lib

然后,编译xbxo.dll.

测试结果:

   耗时(秒) 内存(M)
不使用Hoard( hotfox.exe) 7.0 在160~710之间变动
使用Hoard( use_hoard_hotfox.exe) 3.3 稳定在500

在调试xbox时出现以下错误

HEAP[hotfox.exe]: Invalid Address specified to RtlFreeHeap( 00DF0000, 02B42AB0 )
Windows 已在 hotfox.exe 中触发一个断点。

其原因可能是堆被损坏,这也说明 hotfox.exe 中或它所加载的任何 DLL 中有 bug。

输出窗口可能提供了更多诊断信息

发现是xbox的编译选项是/MT,修改为/MD后问题解决.解释如下:
The _CrtIsValidHeapPointer function is used to ensure that a specific memory address is within the local heap. The local heap refers to the heap created and managed by a particular instance of the C run-time library. If a dynamic-link library (DLL) contains a static link to the run-time library, it has its own instance of the run-time heap, and therefore its own heap, independent of the application's local heap.

4.2结论

.使用Hoard后,内存操作速度提高了,对内存峰值的要求降低了.

5.发布

发布时需要增加winhoard.dll



Hoard内存分配器的学习手记

准备工作 发现我膜拜的项目中竟然直接应用了hoard的代码555,所以拿来看看到底哪里厉害! Hoard项目的官方网站在http://www.hoard.org/ 它自己配了一部分英文简介,很容...
  • zgl07
  • zgl07
  • 2013-05-15 22:01:28
  • 1038

深入Linux的内存管理,关于PTMalloc3、Hoard和TCMalloc

原文地址:http://blog.csdn.net/littlefang/article/details/6052058
  • yazhouren
  • yazhouren
  • 2014-08-14 10:00:50
  • 682

poj1827A Bunch Of Monsters(贪心)

题目链接: 啊哈哈,点我点我 题目意思: 给出n个怪物可以拿到卡片的范围和这个怪物对主人公造成的伤害。。然后求最后得到怪物对主人公的最小伤害。。 思路:对怪物造成的伤害从大到小排序,然后对n个怪物进...
  • u014303647
  • u014303647
  • 2014-08-07 23:16:23
  • 686

Hotfox Agent使用示例

Hotfox Agent是开发Hotfox Client的Native C开发库。 导出的函数包括: .htx_c_api中的HTX_xxx系列函数 .umx2c.h中的UMX_xxx,RS_x...
  • wherwh
  • wherwh
  • 2010-04-15 20:58:00
  • 291

hdu1538 A Puzzle for Pirates

A Puzzle for Pirates Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Other...
  • u010422038
  • u010422038
  • 2013-09-30 23:52:33
  • 1017

Redis源码分析-TCMalloc

redis很多地方都在调用zmalloc函数 zmalloc在这里定义zmalloc.c void *zmalloc(size_t size) { void *ptr = malloc(siz...
  • unix21
  • unix21
  • 2013-09-26 18:16:09
  • 1225

“三个盒子藏金币的问题”“海盗藏金问题”

今天在公司发了一个老问题的讨论。有三个盒子,其中的一个里面藏有100块钱。你从中选择一个,选完之后,主持人在剩下的两个盒子里面打开一个空的盒子。然后,问你要不要换一下你手中的盒子。结果十多个人讨论了一...
  • erics_lele
  • erics_lele
  • 2008-01-15 16:07:00
  • 1166

HDU1538——A Puzzle for Pirates(博弈论,海盗分金问题)

A Puzzle for Pirates Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Ot...
  • say_c_box
  • say_c_box
  • 2017-03-01 21:32:46
  • 227

Glibc内存管理--ptmalloc2源代码分析

原文地址:http://mqzhuang.iteye.com/blog/1005909
  • yazhouren
  • yazhouren
  • 2014-08-14 10:17:20
  • 1219

hotfox支持手机通信协议

另外开一个端口,为手机用户提供服务。hotfox.conf增强,为协议模块,默认UMX协议.mtp是手机协议对应的模块实现。 mtp的代码位于:/RB-2.6/源代码/Server/prot_mod/...
  • wherwh
  • wherwh
  • 2010-06-25 00:08:00
  • 381
收藏助手
不良信息举报
您举报文章:hotfox使用Hoard
举报原因:
原因补充:

(最多只允许输入30个字)