ti7*_*ti7 5 c c++ arrays performance
将已知大小的数组中的简单数据类型移动到特定位置的最快方法是什么?
我的具体情况是旋转存储为int [9]的游戏板
[0,1,2,3,4,5,6,7,8]变为[6,3,0,7,4,1,8,5,2]
在我的用例中,我有一个这些数组的向量,每个数组都需要旋转.
电路板布局:
board1|corners|centers
0 1 2 | 0 2 | 1
3 4 5 | | 3 5
6 7 8 | 6 8 | 7
board2|corners|centers
6 3 0 | 6 0 | 3
7 4 1 | | 7 1
8 5 2 | 8 2 | 5
Run Code Online (Sandbox Code Playgroud)
我想出的最快的方法是创建一个公共变量来分配数组条目,然后将内存复制回来.
int layout[9];
int pub_layout[9];
#include <cstring> // for std::memcpy
void rotate(int layout[])
{
pub_layout[4] = layout[4]; // center
pub_layout[0] = layout[6]; // corner four
pub_layout[6] = layout[8];
pub_layout[8] = layout[2];
pub_layout[2] = layout[0];
pub_layout[1] = layout[3]; // center four
pub_layout[3] = layout[7];
pub_layout[7] = layout[5];
pub_layout[5] = layout[1];
std::memcpy(layout,pub_layout,sizeof(pub_layout));
}
Run Code Online (Sandbox Code Playgroud)
我在这里看到了一个类似的问题,它建议
int[] b = new int[] {b[6], b[3], b[0], b[7], b[4], b[1], b[8], b[5], b[2]};
..尽管它的时钟速度要慢得多(不到单个线程速度的一半)
两者都相对较快(参见此处测试)
如果这不是最快的方法,那是什么?
我怀疑C和C++中的算法是相同的.
通过这个,您可以获得 memcpy 调用和 [4] 到 [4] 分配。您丢失了对该putAside变量的两次赋值。所以它肯定会快一点。
int layout[9];
int putAside;
void rotate(int[] layout)
{
putAside = layout[0];
layout[0] = layout[6]; // corner four
layout[6] = layout[8];
layout[8] = layout[2];
layout[2] = putAside;
putAside = layout[1];
layout[1] = layout[3]; // center four
layout[3] = layout[7];
layout[7] = layout[5];
layout[5] = putAside;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
194 次 |
| 最近记录: |