注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

请移步gmd20.github.com

// 编程和生活。不再使用,网易博客功能异常他们都没人维护了

 
 
 

日志

 
 

Windows上面编译和简单测试一下leveldb-1.9.0  

2013-02-07 16:04:34|  分类: 程序设计 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
已经port到windows 平台了,不过在官网下载的源码包是不能直接编译的
https://code.google.com/p/leveldb/downloads/list

官方的git 里面有windows的分支,不过很遗憾,由于我们伟大的防火墙,git clone不下来。不过看在线的源码,应该里面的源码也是不完整的。
不过那个分支下面有个Windows的编译文档的说明 https://code.google.com/p/leveldb/source/browse/WINDOWS?name=windows



1. 在vc里面创建 动态链接库工程,指定已经存在的目录,直接把leveldb的源文件导入项目里面。
2.  配置 boost 和 leveldb的include目录
3. 添加预定义宏,LEVELDB_PLATFORM_WINDOWS 和OS_WIN
4.  到官方的 windows 分支,和 这里 http://code.google.com/r/kkowalczyk-leveldb/source/browse/#git%2Fwin 找到下面这些文件,添加到 leveldb的目录和工程里面去。    
    utill/env_win.cc
    util/win_logger.h
    utl/win_logger.cc
    port/port_win.h
    port/port_win.cc

    修改
    port.h  
加上 Windows平台的头文件   port/port_win.h

// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.

#ifndef STORAGE_LEVELDB_PORT_PORT_H_
#define STORAGE_LEVELDB_PORT_PORT_H_

#include <string.h>

// Include the appropriate platform specific file below. If you are
// porting to a new platform, see "port_example.h" for documentation
// of what the new port_<platform>.h file must provide.
#if defined(LEVELDB_PLATFORM_POSIX)
# include "port/port_posix.h"
#elif defined(LEVELDB_PLATFORM_CHROMIUM)
# include "port/port_chromium.h"
#elif defined(LEVELDB_PLATFORM_WINDOWS)
# include "port/port_win.h"

#endif

#endif // STORAGE_LEVELDB_PORT_PORT_H_


参考 port_posix.h 修改。
port/port_win.h
 port/port_win.cc
加上  InitOnce 的声明和定义

// Thread-safe initialization.
// Used as follows:
// static port::OnceType init_control = LEVELDB_ONCE_INIT;
// static void Initializer() { ... do something ...; }
// ...
// port::InitOnce(&init_control, &Initializer);
typedef long OnceType;
#define LEVELDB_ONCE_INIT 0
extern void InitOnce(port::OnceType*, void (*initializer)());

//----------------cpp-----------------------------------

 void InitOnce(OnceType* once, void (*initializer)()) {

if (InterlockedCompareExchange (once, 1,0) == 0 ) {
initializer();
}
}



5.  修复头文件 包含的错误 unistd.h

#ifdef WIN32
#include <io.h>
#include <process.h>
#else
#include <unistd.h>
#endif


6. 从项目里面移除所有 xxx_text.c c  xxxx_bench.cc 测试和性能测试相关源文件。

7. 从 http://code.google.com/r/kkowalczyk-leveldb/source/browse/#git%2Fwin 复制dll导出符号定义文件。
    工程属性 -》  linker -》 input -》 module definition file指定导出符号文件。

LIBRARY libleveldb
EXPORTS

; db operations
leveldb_open
leveldb_close
leveldb_put
leveldb_delete
leveldb_write
leveldb_get
leveldb_create_iterator
leveldb_create_snapshot
leveldb_release_snapshot
leveldb_property_value
leveldb_approximate_sizes

; management
leveldb_destroy_db
leveldb_repair_db

; iterator
leveldb_iter_destroy
leveldb_iter_valid
leveldb_iter_seek_to_first
leveldb_iter_seek_to_last
leveldb_iter_seek
leveldb_iter_next
leveldb_iter_prev
leveldb_iter_key
leveldb_iter_value
leveldb_iter_get_error

; write batch
leveldb_writebatch_create
leveldb_writebatch_destroy
leveldb_writebatch_clear
leveldb_writebatch_put
leveldb_writebatch_delete
leveldb_writebatch_iterate

; options
leveldb_options_create
leveldb_options_destroy
leveldb_options_set_comparator
leveldb_options_set_create_if_missing
leveldb_options_set_error_if_exists
leveldb_options_set_paranoid_checks
leveldb_options_set_env
leveldb_options_set_info_log
leveldb_options_set_write_buffer_size
leveldb_options_set_max_open_files
leveldb_options_set_cache
leveldb_options_set_block_size
leveldb_options_set_block_restart_interval

; compression
leveldb_options_set_compression

; comparator
leveldb_comparator_create
leveldb_comparator_destroy

; read options
leveldb_readoptions_create
leveldb_readoptions_destroy
leveldb_readoptions_set_verify_checksums
leveldb_readoptions_set_fill_cache
leveldb_readoptions_set_snapshot

; write options
leveldb_writeoptions_create
leveldb_writeoptions_destroy
leveldb_writeoptions_set_sync

; cache
leveldb_cache_create_lru
leveldb_cache_destroy

; env
leveldb_create_default_env
leveldb_env_destroy

; misc
leveldb_free


编译得到 dll和lib文件,根据源码目录下  c_test.cc 写个简单的测试。

#include "leveldb/c.h"




leveldb_t* db;
leveldb_comparator_t* cmp;
leveldb_cache_t* cache;
leveldb_env_t* env;
leveldb_options_t* options;
leveldb_readoptions_t* roptions;
leveldb_writeoptions_t* woptions;
char* err = NULL;


env = leveldb_create_default_env();
cache = leveldb_cache_create_lru(100000);

options = leveldb_options_create();
// leveldb_options_set_comparator(options, cmp);
//leveldb_options_set_error_if_exists(options, 1);
//leveldb_options_set_cache(options, cache);
//leveldb_options_set_env(options, env);
//leveldb_options_set_info_log(options, NULL);
//leveldb_options_set_write_buffer_size(options, 100000);
//leveldb_options_set_paranoid_checks(options, 1);
//leveldb_options_set_max_open_files(options, 10);
//leveldb_options_set_block_size(options, 1024);
//leveldb_options_set_block_restart_interval(options, 8);
leveldb_options_set_compression(options, leveldb_no_compression);

//roptions = leveldb_readoptions_create();
//leveldb_readoptions_set_verify_checksums(roptions, 1);
//leveldb_readoptions_set_fill_cache(roptions, 0);


woptions = leveldb_writeoptions_create();
//leveldb_writeoptions_set_sync(woptions, 1); //同步写非常慢
leveldb_writeoptions_set_sync(woptions, 0);

leveldb_destroy_db(options, "D:/Trace/test.db" , &err);

leveldb_options_set_create_if_missing(options, 1);
db = leveldb_open(options, "D:/Trace/test.db", &err);



leveldb_put(db, woptions, "foo", 3, "hello", 5, &err);
//leveldb_writebatch_t* wb = leveldb_writebatch_create();
//leveldb_writebatch_put(wb, "foo", 3, "a", 1);
//leveldb_writebatch_clear(wb);
//leveldb_writebatch_put(wb, "bar", 3, "b", 1);
//leveldb_writebatch_put(wb, "box", 3, "c", 1);
//leveldb_writebatch_delete(wb, "bar", 3);
//leveldb_write(db, woptions, wb, &err);



char data [200];
char key[64];

QueryPerformanceCounter(&t0);
unsigned long last_time = GetTickCount();
unsigned long max_time =0;

int i, j;
for (i=0; i< 5000000; i++) {
//UpdateTimeString(date,64);
itoa(i, key,10);
leveldb_put(db, woptions,key,strlen(key) , data, 200, &err);

unsigned long time = GetTickCount();
unsigned long max = time - last_time;
last_time = time;
if (max > max_time) {
max_time = max;
}
}

QueryPerformanceCounter(&t1);

std::cout << "最大耗时 " << max_time << " 毫秒" << endl;
unsigned long time = (((t1.QuadPart-t0.QuadPart)*1000000)/freq.QuadPart);
std::cout << "执行 " << i <<" 次, 耗时 " << time << " 微秒" << std::endl;




顺序的  200个字节长度的写入测试
统计的单操作最大耗时 1406 毫秒        。 这个异步操作还是会有耗时1秒 2秒的等待啊.
执行 5000000 次, 耗时 182999432 微秒,平均每个操作耗时36.6微秒。
cpu利用率很低,5%到25%左右,另外一次测死看到平均每个写入操作耗时34.1479 微秒
可以看到每秒30M左右的写入速度(好像我用的这个电脑磁盘比较性能非常差)。如果写入缓存比较小,可看到很多磁盘读操作,这个在磁盘上做merge?

跟官方网站
fillseq      :       1.765 micros/op;   62.7 MB/s 
的数据 还比较大的差距,可能和那些参数配置相关吧。

不同的参数有影响写入速度的稳定性。
其中write buffer大小,如果比较小的话,读操作很多。如果设置write buffer 为100M,写操作几乎咩有。

Windows上面编译测试leveldb-1.9.0 - widebright - widebright的个人空间
 
Windows上面编译测试leveldb-1.9.0 - widebright - widebright的个人空间
 
  评论这张
 
阅读(5002)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018