使用orm2进行一些性能测试,似乎比直接用sql查询慢4倍。有什么想法吗?
https://github.com/gmaggiotti/rule-restApi/tree/orm-poc
使用ORM2进行基准测试
Document Path: /rules/
Document Length: 6355 bytes
Concurrency Level: 100
Time taken for tests: 5.745 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 6484000 bytes
HTML transferred: 6355000 bytes
Requests per second: 174.06 [#/sec] (mean)
Time per request: 574.526 [ms] (mean)
Time per request: 5.745 [ms] (mean, across all concurrent requests)
Transfer rate: 1102.13 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.3 0 2
Processing: 118 552 83.1 555 857
Waiting: 116 552 83.1 555 857
Total: 119 552 83.0 555 857
仅使用sql进行基准测试
Document Path: /rules/
Document Length: 6355 bytes
Concurrency Level: 100
Time taken for tests: 1.630 seconds
Complete requests: 1000
Failed requests: 0
Total transferred: 6484000 bytes
HTML transferred: 6355000 bytes
Requests per second: 613.38 [#/sec] (mean)
Time per request: 163.032 [ms] (mean)
Time per request: 1.630 [ms] (mean, across all concurrent requests)
Transfer rate: 3883.92 [Kbytes/sec] received
Connection Times (ms)
min mean[+/-sd] median max
Connect: 0 0 0.3 0 2
Processing: 98 158 49.2 137 361
Waiting: 98 158 49.2 137 361
Total: 98 158 49.4 137 362
答案 0 :(得分:0)
不确定这是否值得回答,但评论时间太长。
对于每个ORM,这(根据我的经验)适用于每种语言/平台。通常,您不会将ORM用于查询性能,而是将它们用于代码维护优化和开发人员速度。
为什么会这样?好吧,作为一项规则,ORM必须将你在语言X中所说的内容翻译成SQL,这样他们就不会经常提出最优化的查询。他们通常会动态地进行查询生成,因此实际的"建设" (理想情况下参数化)SQL的字符串需要一些时间,因为可以反映本机代码对象的结构,以找出正确的列名称等。
许多ORM在执行此操作方面也不是完全确定的,这意味着底层数据库缓存查询计划的时间比其他情况下更难。此外,我无法在您提供的链接中找到您的实际基准测试;你可能没有实际测量苹果到苹果。
所以我不能专门回答您使用的特定模块而不花费更多时间,但总的来说,由于上述原因,我会不鼓励这一问题。我经常使用的工作流程是使用ORM进行我的所有开发,并担心优化查询等,一旦我可以进行一些生产时间分析,那时我会用直接SQL替换最坏的违规者或者可能存储过程或视图(取决于数据库引擎),以提高实际重要性能。