我在一个c++类中有一个函数(func),想从python端调用它,以调用以下序列,并使用 尽可能低的延迟:
1_在python方面:func(np.array([1,2,3,4,5])或func([1,2,3,4,5])或二维数组,以及你对降低延迟的任何其他建议。
2_在c++方面:我有一个类型为 "占位符 "的占位符。franka::RobotState robot_state_。 我想把上面数组的一部分复制到里面去,比如我可以这样做。
for (int i = 0; i < 7; ++i) {
robot_state_.q [i] = array_that_came_from_python_side [i];
robot_state_.dq [i] = array_that_came_from_python_side [i+7];
robot_state_.tau_J [i] = array_that_came_from_python_side [i+14];
}
3_然后我已经写好的下一行会更新另一个占位符的类型 法兰卡::扭矩_eff_cmd 我想将其返回到python端,并想象像下面这样做。
for (int i = 0; i < 7; ++i) {
array_to_return[i] = _eff_cmd[i]
}
return array_to_return // to be sent to the python side
其中array_to_return可以在python端用任何类型返回,如numpy数组或list或任何其他建议,如输入。 然后我将在python端以高频率重复这个序列,因为它基本上是一个控制反馈循环。
我的问题是如何在Cython中以最快的方式实现这个功能,我在C++中用什么来定义func。以下是 这条 一种可能的方式,提供了一个较低的延迟似乎 记忆之窗但到目前为止,我还不能很好地理解它,以知道我最好在c++代码和Cython pyx文件中写什么。如果有谁能指导我,我将非常感激,如果你也有其他的建议,而不是内存视图,我将会非常感激 低延迟.
当涉及到性能优化时,你必须要测量!
首先确保你确切知道你的热点在哪里。你可以使用 perf
或英特尔 vTune
以确保你优化的位置正确。
比你可以写一个 google benchmark
测试那个特定的热点。
如果这个片段是你的热点,拆分循环会帮助你,因为你有连续的内存访问。
for (int i = 0; i < 7; ++i) {
robot_state_.q [i] = array_that_came_from_python_side [i+7];
}
for (int i = 0; i < 7; ++i) {
robot_state_.dq [i] = array_that_came_from_python_side [i+7];
}
for (int i = 0; i < 7; ++i) {
robot_state_.tau_J [i] = array_that_came_from_python_side [i+14];
}
或者它可能什么都不会做,因为现在的编译器非常聪明。
也许 std::memcopy
会做得很好
std::memcpy(robot_state_.q, &array_that_came_from_python_side[0], 7);
std::memcpy(robot_state_.dq, &array_that_came_from_python_side[7], 7);
std::memcpy(robot_state_.tau_J , &array_that_came_from_python_side[14], 7);