你好查尔斯,
谢谢你提出这个性能问题。我假设从你的代码片段,计时是在基础工作空间(即直接在MATLAB命令窗口下)或作为一个脚本。
在base-workspace/script和函数之间存在着重要的、有时非常重要的性能暗示。例如,这里我把你的代码放在一个函数中:
函数SwensonTiming
var = {' a ' ' b ' ' c ' ' d '};
varType = {'double' 'double' 'double' 'double'};
Rows = [100 1000 10000 100000 200000 300000 400000 500000];
d1 = 0(大小(行));d2 = 0(大小(行));
为i = 1:长度(行)
T =表(“大小”, (1) e6、长度(var)),“VariableNames”var,“VariableTypes”, varType);
抽搐
肺结核(1:行(i)) =兰德([行(i), 1]);
d1 (i) = toc;
流('1)向量写入%。0f行接受%。4 f秒\ n”行(i), d1 (i));
抽搐
为j = 1:行(我)
T.A (j) =兰德;
结束
d2 (i) = toc;
流('2)循环写入%。0f行接受%。4 f秒\ n \ n”行(i), d2 (i));
结束
数字
重对数(行,[d1;d2)
传奇(“向量写”,循环写的);
请注意,您的代码和上面的函数(具有完全相同的代码)都在计时中包含rand(),尽管它对运行时没有任何重要贡献。
在我的~4年旧的Core-i5/16GB ram桌面,运行MATLAB R2020a Update 4,“循环写”部分按预期线性扩展-也显示了你的代码的plot(当在一个函数中)产生:
> > SwensonTiming
1)向量写100行需要0.0003秒
2)循环写100行需要0.0073秒
1)向量写1000行需要0.0003秒
2)循环写1000行需要0.0666秒
1)向量写10000行需要0.0005秒
2)循环写10000行需要0.6360秒
1)向量写100000行需要0.0023秒
2)循环写100000行需要6.8393秒
1)向量写入200000行需要0.0057秒
2)循环写200,000行需要14.4702秒
1)向量写入300000行需要0.0068秒
2)循环写300000行需要20.4186秒
1)向量写40万行需要0.0128秒
2)循环写40万行需要26.2447秒
1)向量写500000行需要0.0115秒
2)循环写500000行需要32.3546秒
当然,向量化仍然可以获得更好的性能,但是示例中的标量循环赋值可以按照预期进行扩展。
如果您的用例仍然遇到性能问题,请与我们联系。我们想更多地了解你们的工作流程。