代码之家  ›  专栏  ›  技术社区  ›  Ted

服务堆栈.OrmLite:写/读速度慢?

  •  0
  • Ted  · 技术社区  · 6 年前

    6月30日更新 这个问题使基准测试更加清晰,Mythz发现了一个问题并解决了它: ServiceStack benchmark continued: why does persisting a simple (complex) to JSON slow down SELECTs?


    写/读速度合理吗?

    在我试用OrmLite时,我将测试如何将所有当前数据/对象从我们自己的实现转换为保存到数据库,并切换到OrmLite。

    我做的测试是使用Customer类,它有一系列属性(在我们的产品中使用,所以在我们当前的版本中每天都使用这个类)。

    如果我创建10000个这样的对象,然后测量将这些对象持久化到MySql数据库(序列化+写入db)所需的时间,结果是:


    更新

    由于“当前实现”是欺骗(它只是将一个字节[]填充到数据库),我实现了一个简单的RelationDbHandler,它用一个简单的SQL查询以正常的方式持久化10000个对象。结果添加到下面。




    OrmLite(使用.Save):94秒

    读取10000个对象:

    OrmLite(使用Select<>):28秒

    我在本地运行它,在SSD磁盘上,CPU或磁盘上没有其他负载。

    我在ServiceStack网页上读到了一些基准测试的东西( https://github.com/ServiceStack/ServiceStack/wiki/Real-world-performance ),但大部分链接区域已死亡。有人说读25000行需要245ms,但我不知道一行是什么样子。

    问题1:有什么基准我可以阅读更多?
    问题2:下面指定了客户对象。mythz认为上面的写/读时间合理吗?

    测试用例:

    enter image description here

     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;
                }
            }
    
    1 回复  |  直到 6 年前
        1
  •  0
  •   mythz    6 年前

    使用 Insert() 用于插入行。 Save() 将检查现有记录是否存在并更新它,如果存在,还将填充自动递增主键(如果创建了任何主键)。

    还有 InsertAsync() MySql.数据 NuGet包没有正确的异步实现,在这种情况下使用 https://github.com/mysql-net/MySqlConnector ServiceStack.OrmLite.MySqlConnector NuGet包及其使用 MySqlConnectorDialect.Provider .

    MySql.数据 NuGet包。

    https://github.com/tedekeroth/OrmLiteVsFastSerializer

    在我的测试中,我还注意到几个序列化异常被吞没,这将对性能产生负面影响,您可以通过在启动时配置来引发异常:

    OrmLiteConfig.ThrowOnError = JsConfig.ThrowOnError = true;