首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ServiceStack.OrmLite:慢写/慢读?

ServiceStack.OrmLite:慢写/慢读?
EN

Stack Overflow用户
提问于 2018-06-26 06:35:55
回答 1查看 451关注 0票数 0

更新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保存的代码:

代码语言:javascript
复制
 public void MyTestMethod<T>(T coreObject) where T : CoreObject
    {
        long id = 0;
        using (var _db = _dbFactory.Open())
        {
            id = _db.Insert<T>(coreObject, selectIdentity: true);
        }           
    }

从表中读取所有内容的代码:

代码语言:javascript
复制
 internal List<T> FetchAll<T>()
        {
            using (var _db = _dbFactory.Open())
            {
                List<T> list = _db.Select<T>();
                return list;
            }
        }
EN

回答 1

Stack Overflow用户

发布于 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中的准关系模型进行比较。

在我的测试中,我还注意到有几个序列化异常正在被吞并,这会对性能产生负面影响,您可以在启动时配置异常:

代码语言:javascript
复制
OrmLiteConfig.ThrowOnError = JsConfig.ThrowOnError = true;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51036307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档