- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我与MATLAB OOP尝试,作为一个开始我模仿我的C++的记录器类和我把我所有的字符串辅助函数在String类,以为这将是巨大的,能够做的事情一样a + b
,a == b
,a.find( b )
代替strcat( a b )
, strcmp( a, b )
,检索第一个元素 strfind( a, b )
等。
问题:减速
我使用了上述东西,并立即注意到急剧放缓。我做错了吗(这当然是可能的,因为我的 MATLAB 经验相当有限),还是 MATLAB 的 OOP 只是引入了很多开销?
我的测试用例
这是我对字符串所做的简单测试,基本上只是附加一个字符串并再次删除附加部分:
Note: Don't actually write a String class like this in real code! Matlab has a native
string
array type now, and you should use that instead.
classdef String < handle
....
properties
stringobj = '';
end
function o = plus( o, b )
o.stringobj = [ o.stringobj b ];
end
function n = Length( o )
n = length( o.stringobj );
end
function o = SetLength( o, n )
o.stringobj = o.stringobj( 1 : n );
end
end
function atest( a, b ) %plain functions
n = length( a );
a = [ a b ];
a = a( 1 : n );
function btest( a, b ) %OOP
n = a.Length();
a = a + b;
a.SetLength( n );
function RunProfilerLoop( nLoop, fun, varargin )
profile on;
for i = 1 : nLoop
fun( varargin{ : } );
end
profile off;
profile report;
a = 'test';
aString = String( 'test' );
RunProfilerLoop( 1000, @(x,y)atest(x,y), a, 'appendme' );
RunProfilerLoop( 1000, @(x,y)btest(x,y), aString, 'appendme' );
结果
btest 0.550 (with String.SetLength 0.138, String.plus 0.065, String.Length 0.057)
atest 0.015
frpintf( 1, 'test\n' )
,在内部使用 String 类时,对我的系统进行 1000 次调用需要 7 (!) 秒(好吧,它有更多的逻辑,但与 C++ 相比:使用
std::string( "blah" )
和 0x251343124 的系统的开销输出端 vs 普通
std::cout
大约为 1 毫秒。)
function n = atest( x, y )
n = ctest( x, y ); % ctest is in matlab path
function n = btest( x, y )
n = util.ctest( x, y ); % ctest is in +util directory, parent directory is in path
结果,收集方式与上述相同:
atest 0.004 sec, 0.001 sec in ctest
btest 0.060 sec, 0.014 sec in util.ctest
最佳答案
我已经使用 OO MATLAB 一段时间了,最终研究了类似的性能问题。
简短的回答是:是的,MATLAB 的 OOP 有点慢。有大量的方法调用开销,高于主流 OO 语言,而且您无能为力。部分原因可能是惯用的 MATLAB 使用“向量化”代码来减少方法调用的次数,并且每次调用的开销不是高优先级。
我通过编写什么都不做的“nop”函数作为各种类型的函数和方法来对性能进行基准测试。以下是一些典型的结果。
>> call_nops
计算机:PCWIN 版本:2009b
调用每个函数/方法 100000 次
nop() 函数:每次调用 0.02261 秒 0.23 微秒
nop1-5() 函数:每次调用 0.02182 秒 0.22 微秒
nop() 子函数:每次调用 0.02244 秒 0.22 微秒
@()[] 匿名函数:每次调用 0.08461 秒 0.85 微秒
nop(obj) 方法:每次调用 0.24664 秒 2.47 微秒
nop1-5(obj) 方法:每次调用 0.23469 秒 2.35 微秒
nop() 私有(private)函数:每次调用 0.02197 秒 0.22 微秒
classdef nop(obj):每次调用 0.90547 秒 9.05 微秒
classdef obj.nop():每次调用 1.75522 秒 17.55 微秒
classdef private_nop(obj): 0.84738 sec 8.47 usec per call
classdef nop(obj) (m-file): 0.90560 sec 9.06 usec per call
classdef class.staticnop():每次调用 1.16361 sec 11.64 usec
Java nop():每次调用 2.43035 秒 24.30 微秒
Java static_nop():每次调用 0.87682 秒 8.77 微秒
Java nop() 来自 Java:每次调用 0.00014 秒 0.00 usec
MEX mexnop():每次调用 0.11409 秒 1.14 微秒
C nop(): 0.00001 sec 0.00 usec per call
R2008a 到 R2009b 的类似结果。这是在运行 32 位 MATLAB 的 Windows XP x64 上。
“Java nop()”是一个从 M 代码循环内调用的无操作 Java 方法,包括每次调用时 MATLAB 到 Java 的调度开销。 “Java nop() from Java”与在 Java for() 循环中调用的内容相同,并且不会产生边界惩罚。对 Java 和 C 的计时持保留态度;一个聪明的编译器可以完全优化调用。
包作用域机制是新的,大约与 classdef 类同时引入。它的行为可能是相关的。
几个初步结论:
obj.nop()
语法比 nop(obj)
语法慢,即使对于 classdef 对象上的相同方法也是如此。 Java 对象(未显示)也是如此。如果你想快点,请拨打 nop(obj)
。 foo(obj)
语法,成本现在与旧样式类相当。因此,在大多数情况下,方法速度不再是坚持使用旧样式类的理由。 (荣誉,MathWorks!)obj.method()
语法和
method(obj)
一样快,并且比旧的 OOP 对象快得多。
关于matlab - MATLAB OOP 速度慢还是我做错了什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1693429/
我的应用程序中有以下查询: SELECT a.*, f.* FROM flights_database f JOIN airports a ON f.airport = a.airportNameCl
我们在使用 MySQL(以及 MariaDB)时遇到了一个奇怪的问题。一个简单的数据库,有 2 个表(InnoDB 引擎),都包含(以及其他一些)3 或 4 个带有 XML 数据的文本列。大小为 1-
我在 MySQL 上的执行路径上遇到问题,导致查询缓慢且不一致。这是一个全新的现象。我们还有其他具有完全相同(好吧,尽可能接近)设置的表,这很好,但出于某种原因,现在创建新表会遇到这个缓慢/不一致的问
我使用 Eclipse Marketplace 的下载速度始终非常慢(现在从 http://download.eclipse.org 开始,下载速度为 3 MB/s,下载速度为 25 kB/s),这使
我正在开发一个 Qt Creator 项目,其中包含大量头文件(点云库、Boost 等)。例如。 Boost 有大约 9000 个头文件。现在看来,包含的数量确实减慢了 IDE。代码完成很慢,大约。
我在一个项目中使用 document.elementFromPoint,它看起来很慢。 100,000 次迭代需要 7051 毫秒。 document.getElementsByTagName("*"
我有一个 tableView ,每行有四个图表,大约 20 行。当我尝试滚动表格时,我将删除现有图表并为每一行构建新图表。 此操作使 TableView 的滚动非常慢。任何使滚动速度更快以及加载新图表
我有一个如下所示的数据框: date,time,metric_x 2016-02-27,00:00:28.0000000,31 2016-02-27,00:01:19.0000000,40 2016-
TLDR:我的微调器瞬间显示了错误的颜色。 我的微调器有问题。每当我运行应用程序时,如果 Activity 没有缓存在内存中,它有时会滞后。在我可以将其设置为正确的颜色之前,文本是默认颜色(如黑色)。
我在使用 SELECT COUNT(*) 对大型表进行 SQLite 时遇到性能问题。 由于我还没有收到可用的答案并且我做了一些进一步的测试,所以我编辑了我的问题以纳入我的新发现。 我有 2 个表:
当音频因加载数据不足(速度慢)而暂停时,我可以使用什么事件? 就像: $audio.on('suspendToLoading',function(){ alert('loading...');
这是我的 MATLAB 程序的分析模拟运行结果。我需要运行此模拟数十万次(约 100,000 次)。 因此我需要一种更快的方法来读取 Excel 文件。 规范:Excel 文件由 10000x2 个单
每当与数据透视表交互时,Excel 都非常慢,这让我感到非常困难。添加/删除字段、更改过滤器或切片器,所有这些都需要 Excel 卡住几分钟才能响应。 看来生成的 MDX 效率极低。我可以理解他们必须
我正在使用 Entity Framework 来检索大型数据集。 数据集有parent/child关系,我需要和parent同时带回child信息。 我发现 EF 最初发送一个查询以获取父对象列表,然
我有一个使用 gridview 的应用程序,它非常慢。 添加 Trace=true 后对于页面,我追踪了时间花费的地方:在 GridView 上调用 BindData() 时。 GridView连接到
我编写了一个小代码来使用 QtCreator 测试 QGraphicsView 的功能。 代码非常简单,只是创建了一个继承自 QGraphicsView 的类,上面有一个 QGraphicsScene
后期以补充作品的形式自动加入成员(member)。数据库速度较慢。有没有办法加快这个速度?用户无所谓..除了自动补码之外如何停止写?(自动补码;城市输入。成员(member)表格位于。) 注册.php
我有一个文件 (insert.sql),其中有 250k 行,没有键,没有索引: INSERT `project_383`.`entity_metrics_build_1` VALUES ('d402
我最近开发了一个应用程序(java 8、spring-boot、hibernate、maven),它通过 REST API 公开数据库。我遇到的问题是数据库调用很慢(3000 毫秒以上),只是为了获取
我正在尝试在 Canvas 上使用旋转,我现在有了它,因此每个对象都有自己的旋转。如果没有它们旋转,我可以在一台非常低端的计算机上在屏幕上显示大约 400 个对象,在一台正常库存的计算机上显示近 20
我是一名优秀的程序员,十分优秀!