更新6月30日这个问题做了一个更干净的基准测试,Mythz发现了一个问题并解决了它:ServiceStack基准测试接着说:为什么坚持简单(复杂)到JSON的慢速选择?
写/读速度是否合理?
这是我在OrmLite方面的尝试,我将测试如何将所有当前的数据/对象从我们自己的实现中转换成数据库,并切换到OrmLite。
但是,我做了一个简单的基准测试/速度测试,比较了当前的序列化和对db的写入以及从db读取和反序列化。
我发现,ServiceStack比我们目前所做的要慢得多(我们目前只是使用FastSerializer序列化对象,并将byte[]数据写入BLOB字段,因此读写速度快,当然也有明显的缺点)。
我所做的测试是使用Customer类,它有很多属性(在我们的产品中使用,所以在当前版本中每天都使用这个类)。
如果我创建了10000个这样的对象,那么度量将这些对象持久化到MySql数据库(序列化+写到db)所需的时间,结果如下:
更新
由于“当前实现”是欺骗(它只是将BLOBing作为一个byte[]到数据库),我用一个简单的RelationDbHandler查询实现了一个简单的RelationDbHandler,它以正常的方式持久化了10000个对象。结果加在下面。
编写10000个对象:
目前执行情况:33秒
OrmLite (使用.Save):94秒
关系方法: 24.7秒
读取10000个对象:
目前的执行情况:1.5秒
OrmLite (使用Select<>):28秒关系处理:16秒
我在本地运行,在SSD磁盘上运行,CPU或磁盘上没有其他负载。我预计我们当前的实现会更快,但不会更快。
我在ServiceStack网页(https://github.com/ServiceStack/ServiceStack/wiki/Real-world-performance)上读到了一些基准的东西,但是大部分链接区域都死了。有些人很清楚,读25000行需要245 ms,但我不知道一行是什么样子。
问题1:有什么基准我可以读到更多吗?
问题2:下面指定了Customer对象。神话认为上面的写/读时间合理吗?
测试用例:这是在OrmLite创建表后在数据库中查看的Customer对象。我只填充了5个属性,其中一个是“复杂的”(因此只有一个字段在行中有一个JSON序列化表示),但是由于所有字段都是编写的,所以我认为这无关紧要吗?

使用OrmLite保存的代码:
public void MyTestMethod<T>(T coreObject) where T : CoreObject
{
long id = 0;
using (var _db = _dbFactory.Open())
{
id = _db.Insert<T>(coreObject, selectIdentity: true);
}
}从表中读取所有内容的代码:
internal List<T> FetchAll<T>()
{
using (var _db = _dbFactory.Open())
{
List<T> list = _db.Select<T>();
return list;
}
}发布于 2018-06-26 07:03:37
使用Insert()插入行。Save()将检查现有记录是否存在并更新它,如果存在,还会填充自动增量主键(如果存在)。
也有InsertAsync() API可用,但甲骨文的官方MySql.Data NuGet包没有一个正确的异步实现,在这种情况下,使用https://github.com/mysql-net/MySqlConnector可以通过安装ServiceStack.OrmLite.MySqlConnector NuGet包和使用其MySqlConnectorDialect.Provider获得更好的结果。
使用.NET Core还可以获得更好的性能,它将使用最新的8.x MySql.Data NuGet包。
注意:https://github.com/tedekeroth/OrmLiteVsFastSerializer中的结果是不可比较的,这实质上是将MySql作为NoSQL blob存储与在具有多个复杂类型块字段的OrmLite中的准关系模型进行比较。
在我的测试中,我还注意到有几个序列化异常正在被吞并,这会对性能产生负面影响,您可以在启动时配置异常:
OrmLiteConfig.ThrowOnError = JsConfig.ThrowOnError = true;https://stackoverflow.com/questions/51036307
复制相似问题