小编Mik*_*kes的帖子

提高SQLite的每秒INSERT性能?

优化SQLite很棘手.C应用程序的批量插入性能可以从每秒85次插入到每秒超过96,000次插入!

背景:我们使用SQLite作为桌面应用程序的一部分.我们有大量的配置数据存储在XML文件中,这些数据被解析并加载到SQLite数据库中,以便在初始化应用程序时进行进一步处理.SQLite非常适合这种情况,因为它速度快,不需要专门配置,数据库作为单个文件存储在磁盘上.

理由: 最初我对我所看到的表现感到失望.事实证明,SQLite的性能可能会有很大差异(对于批量插入和选择),具体取决于数据库的配置方式以及如何使用API​​.弄清楚所有选项和技术是什么并不是一件小事,所以我认为创建这个社区wiki条目以与Stack Overflow读者分享结果是谨慎的,以便为其他人节省相同调查的麻烦.

实验:我不是简单地谈论一般意义上的性能提示(即"使用事务!"),而是认为最好编写一些C代码并实际测量各种选项的影响.我们将从一些简单的数据开始:

  • 多伦多市完整交通时间表的28 MB TAB分隔文本文件(约865,000条记录)
  • 我的测试机器是运行Windows XP的3.60 GHz P4.
  • 该代码使用Visual C++ 2005 编译为"Release",带有"Full Optimization"(/ Ox)和Favor Fast Code(/ Ot).
  • 我正在使用SQLite"Amalgamation",直接编译到我的测试应用程序中.我碰巧遇到的SQLite版本有点旧(3.6.7),但我怀疑这些结果与最新版本相当(如果你不这么想请发表评论).

我们来写一些代码吧!

代码:一个简单的C程序,它逐行读取文本文件,将字符串拆分为值,然后将数据插入SQLite数据库.在代码的这个"基线"版本中,创建了数据库,但我们实际上不会插入数据:

/*************************************************************
    Baseline code to experiment with SQLite performance.

    Input data is a 28 MB TAB-delimited text file of the
    complete Toronto Transit System schedule/route info
    from http://www.toronto.ca/open/datasets/ttc-routes/

**************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include "sqlite3.h"

#define INPUTDATA "C:\\TTC_schedule_scheduleitem_10-27-2009.txt"
#define DATABASE "c:\\TTC_schedule_scheduleitem_10-27-2009.sqlite"
#define …
Run Code Online (Sandbox Code Playgroud)

c sqlite optimization performance

2880
推荐指数
9
解决办法
38万
查看次数

HTML5如何"取代"Flash?

自推出iPad以来,一场争论的焦点是Flash与HTML5的问题.有些人认为HTML5有朝一日会取代/取代Adobe Flash.

我不开发在浏览器中运行的软件,所以我的(有限的)理解是:

  • HTML是一种纯文本标记语言,通过HTTP传递到客户端浏览器.客户端浏览器根据标准规范解释标记并呈现(具有不同程度的成功)页面.
  • Adobe Flash是一个适用于处理音频,视频,声音和光栅/矢量图形的框架.它需要特殊的创作工具(可能是编译器?)和自定义播放器,它可以作为大多数常见浏览器的插件.

有人可以解释(对于这个C/C++开发人员)从技术/编码的角度来看,基于文本的标记语言(HTML5)可以被视为多媒体框架(Flash)的替代品吗?

请不要发表自己的观点 - 只是技术事实.

flash markup html5 web-standards

139
推荐指数
8
解决办法
8万
查看次数

"argv [0] =可执行文件名称"是一个公认的标准还是只是一个共同的约定?

main()在C或C++应用程序中传递参数时,将argv[0]始终是可执行文件的名称?或者这只是一个常见的约定,并不保证100%的时间都是真的?

c c++ standards argv

92
推荐指数
5
解决办法
6万
查看次数

如何使用boost :: filesystem"规范化"路径名?

我们在应用程序中使用boost :: filesystem.我有一个'完整'路径,通过将几个路径连接在一起构建:

#include <boost/filesystem/operations.hpp>
#include <iostream>
     
namespace bf = boost::filesystem;

int main()
{
    bf::path root("c:\\some\\deep\\application\\folder");
    bf::path subdir("..\\configuration\\instance");
    bf::path cfgfile("..\\instance\\myfile.cfg");

    bf::path final ( root / subdir / cfgfile);

    cout << final.file_string();
}
Run Code Online (Sandbox Code Playgroud)

最终路径打印为:

c:\some\deep\application\folder\..\configuration\instance\..\instance\myfile.cfg
Run Code Online (Sandbox Code Playgroud)

这是一个有效的路径,但是当我向用户显示它时,我更喜欢它被规范化.(注意:我甚至不确定"标准化"是否是正确的词).像这样:

c:\some\deep\application\configuration\instance\myfile.cfg
Run Code Online (Sandbox Code Playgroud)

早期版本的Boost有一个normalize()功能 - 但它似乎已被弃用和删除(没有任何解释).

有没有理由我不应该使用BOOST_FILESYSTEM_NO_DEPRECATED宏?有没有其他方法可以使用Boost Filesystem库执行此操作?或者我应该编写代码来直接将路径作为字符串操作?

c++ filesystems boost

36
推荐指数
4
解决办法
3万
查看次数

我可以使用模式强制执行XML属性的顺序吗?

我们的C++应用程序从XML文件中读取配置数据,如下所示:

<data>
 <value id="FOO1" name="foo1" size="10" description="the foo" ... />
 <value id="FOO2" name="foo2" size="10" description="the other foo" ... />
 ...
 <value id="FOO300" name="foo300" size="10" description="the last foo" ... />
</data>
Run Code Online (Sandbox Code Playgroud)

完整的应用程序配置包含大约2500个这些XML文件(转换为超过150万个键/值属性对).XML文件来自许多不同的源/团队,并根据模式进行验证.但是,有时<value/>节点看起来像这样:

<value name="bar1" id="BAR1" description="the bar" size="20" ... />
Run Code Online (Sandbox Code Playgroud)

或这个:

<value id="BAT1" description="the bat" name="bat1"  size="25" ... />
Run Code Online (Sandbox Code Playgroud)

为了快速完成此过程,我们使用Expat来解析XML文档.Expat将属性公开为数组 - 如下所示:

void ExpatParser::StartElement(const XML_Char* name, const XML_Char** atts)
{
 // The attributes are stored in an array of XML_Char* where:
 //  the nth element is the …
Run Code Online (Sandbox Code Playgroud)

xml performance xsd expat-parser

17
推荐指数
3
解决办法
2万
查看次数

如何避免与Windows头文件中定义的宏名称冲突?

我有一些C++代码,其中包含一个名为CreateDirectory(). Previous的方法,以前代码只使用了STL和Boost,但最近我必须包括<windows.h>所以我可以查找CSIDL_LOCAL_APPDATA.

现在,这段代码:

filesystem.CreateDirectory(p->Pathname()); // Actually create it...
Run Code Online (Sandbox Code Playgroud)

不再编译:

error C2039: 'CreateDirectoryA' : is not a member of ...
Run Code Online (Sandbox Code Playgroud)

这对应于此宏winbase.h:

#ifdef UNICODE
#define CreateDirectory  CreateDirectoryW
#else
#define CreateDirectory  CreateDirectoryA
#endif // !UNICODE
Run Code Online (Sandbox Code Playgroud)

预处理器正在重新定义我的方法调用.有没有办法避免这种命名冲突?或者我必须重命名我的CreateDirectory()方法?

c++ windows macros collision

17
推荐指数
3
解决办法
5703
查看次数

为什么C++链接器在构建期间需要库文件,即使我是动态链接?

我有一个C++可执行文件,我正在动态链接几个库(Boost,Xerces-c和自定义库).

我明白为什么如果我选择静态链接这些库,我会要求.lib/.a文件(这里有相关的问题).但是,如果我动态链接这些外部库,为什么在链接我的可执行文件时需要提供相应的.lib/.so库文件?

c++ linker gcc visual-c++

14
推荐指数
1
解决办法
2196
查看次数

使用C++命名空间会增加耦合吗?

我知道C++库应该使用命名空间来避免名称冲突,但是因为我已经不得不:

  1. #include 正确的标题(或转发声明我打算使用的类)
  2. 按名称使用这些类

这两个参数不要推断命名空间传达的相同信息.现在使用命名空间引入了第三个参数 - 完全限定名称.如果库的实现发生变化,现在我需要改变三个潜在的事情.根据定义,这不是库代码和我的代码之间耦合的增加吗?


例如,查看Xerces-C:它定义了Parser在命名空间内调用的纯虚拟接口XERCES_CPP_NAMESPACE.我可以Parser通过包含适当的头文件,然后导入命名空间using namespace XERCES_CPP_NAMESPACE或使用前缀声明/定义来使用我的代码中的接口XERCES_CPP_NAMESPACE::.

随着代码的发展,可能需要删除Xerces以支持不同的解析器.我通过纯虚拟接口部分"保护"了库实现的变化(如果我使用工厂来构建我的Parser,更是如此),但是一旦我从Xerces切换到其他东西,我需要通过我的代码梳理和改变我的一切using namespace XERCES_CPP_NAMESPACEXERCES_CPP_NAMESPACE::Parser代码.


最近,当我重构现有的C++项目以将一些现有的有用功能拆分到库中时,我遇到了这个问题:

foo.h中

class Useful;  // Forward Declaration

class Foo
{
public:

    Foo(const Useful& u);
    ...snip...

}
Run Code Online (Sandbox Code Playgroud)

Foo.cpp中

#include "foo.h"
#include "useful.h" // Useful Library

Foo::Foo(const Useful& u)
{
    ... snip ...
}
Run Code Online (Sandbox Code Playgroud)

当时很大程度上是出于无知(并且部分地出于懒惰),所有功能都useful.lib被置于全局命名空间中.

随着内容的useful.lib增长(以及更多客户端开始使用该功能),决定将所有代码移动useful.lib到其自己的名称空间中"useful".

客户端.cpp文件很容易修复,只需添加一个using namespace …

c++ namespaces decoupling

7
推荐指数
3
解决办法
1545
查看次数

如何在Windows上使用Perl从STDIN中读取单个字符?

使用Perl,如何在STDIN不需要用户输入Enter的情况下捕获单个字符(类似于C的getch()功能)?

Perl有一个getc()函数,但是根据perlfunc:

但是,它无法单独用于获取单个字符而无需等待用户按Enter键.

perlfunc文档确实提供了一种使用单个字符读取的方法,getc()但它需要使用操作终端设置stty.我正在编写的脚本需要在Windows上运行(没有cygwin,msys等) - 所以这不是一个选项.

windows perl

6
推荐指数
2
解决办法
8008
查看次数

Solr突出显示还可以指示返回片段在原始字段中的位置或偏移量吗?

背景

使用Solr 4.0.0.我已将一组示例文档的文本编入索引并启用了术语向量,因此我可以使用快速向量突出显示

<field name="raw_text" type="text_en" indexed="true" stored="true" termVectors="true" termPositions="true" termOffsets="true" />
Run Code Online (Sandbox Code Playgroud)

为突出显示我正在使用具有SENTENCE边界的Break Iterator边界扫描器.

<boundaryScanner name="breakIterator" class="solr.highlight.BreakIteratorBoundaryScanner">
    <lst name="defaults">
      <!-- type should be one of CHARACTER, WORD(default), LINE and SENTENCE -->
      <str name="hl.bs.type">SENTENCE</str>
    </lst>
  </boundaryScanner>
Run Code Online (Sandbox Code Playgroud)

我做了一个简单的查询

http://localhost:8983/solr/documents/select?q=raw_text%3AArtibonite&wt=xml&hl=true&hl.fl=raw_text&hl.useFastVectorHighlighter=true&hl.snippets=100&hl.boundaryScanner=breakIterator
Run Code Online (Sandbox Code Playgroud)

突出显示工作得相当好

<response>
...
<result name="response" numFound="5" start="0">
<doc>
  <str name="id">-1071691270</str>
  <str name="raw_text">
     Final Report of the Independent Panel of Experts on the Cholera
     Outbreak in Haiti Dr. Alejando Cravioto (Chair) International
     Center for Diarrhoeal Disease Research, Dhaka, Bangladesh Dr.
     Claudio F. Lanata Instituto …
Run Code Online (Sandbox Code Playgroud)

solr highlighting

6
推荐指数
1
解决办法
2185
查看次数