Slow Matlab R2018b TypedArray array access in C++
我正在使用MATLAB R2018b mex函数将C库与我的MATLAB代码集成在一起。作为其中的一部分,我需要将数据保存在MATLAB数组中,并保存到C指针数组和C结构向量中。但是,映射matlab类型的数组被证明非常慢(对于?800,000个元素,约为0.4秒)。
这是相关代码
1 2 3 4 5 6 7 8 9 | const matlab::data::TypedArray<float> Vertices = std::move(inputs[0]); float* positions = new float[Vertices.getNumberofElements()]; for (size_t i = 0; i < Vertices.getDimensions()[0]; i ++) { ctr = 9 * i; positions[ctr + 0] = Vertices[i][0]; positions[ctr + 1] = Vertices[i][1]; positions[ctr + 2] = Vertices[i][2]; } |
是什么导致此循环变慢?我尝试为Vertices重新排序数组访问,以尝试使代码对缓存更友好,但这并没有产生有意义的加速。现在,对于80万个元素,循环约为0.4ms,理想情况下,内存复制应该花费更少的时间,对吗?
当我查看以前的建议时,我发现大多数答案都使用较旧的mex函数,而new(?)MATLAB C API不具有相同的函数或结构。
编辑:
我遵循了Cris的建议,并在迭代器上进行了循环,从而将速度提高了约一半,达到0.14秒。
我正在使用的新代码是:
1 2 3 4 5 6 7 | const matlab::data::TypedArray<float> Vertices = std::move(inputs[0]); float* positions = new float[Vertices.getNumberofElements()]; for (auto it = Vertices.begin(); it != Vertices.end(); ++it) { positions[ctr] = *it; ++ctr; } |
因此它更快,但仍然令人惊讶地慢(800,000个元素需要0.14秒)。还有其他方法可以加快此循环吗?
通过应用Cris建议并使用以下代码,我大大提高了速度:
1 2 3 | const matlab::data::TypedArray<float> Vertices = std::move(inputs[0]); float* positions = new float[Vertices.getNumberofElements()]; memcpy(positions,&*Vertices.begin,sizeof(float)*Vertices.getNumberofElements()); |
运行时从0.14(使用标准的Visual Studio优化)变为0.0035,对于我的应用程序来说,这是可以接受的快速速度。