c++从字符串到Bitboard的转换和反向优化
c++ Conversion from String to Bitboard and Back Optimization
我正在处理一个游戏状态,该状态作为字符串接收,需要转换为BitBoard。我相信我现在有一个功能可以实现这一点,但我想知道如何优化它以更快地执行?我最初从一个循环开始,有以下想法:
for (i = 0; i < 23; ++i)
{
if (s.at(n) == 'x') set bit[2], // Start with x as there are more x's
else if(s.at(n) == 'W') set bit[0], // W next as W goes first
else set bit[1] // B last
}
但我想我可以打开循环,跳过"I"的比较和递增。完成后,我想我可以删除最后一个对"B"的检查,只需接受W|x的赞美,并从中减去4286578688,就只得到23位。这给了我以下代码:
std::string board = "xBWxWxBWxWxxBxxxWxBxxBx"; // String to convert to bitboard
unsigned int bit; // Integer used for parsing values
unsigned int boards[3] {0, 0, 0}; // W in [0], B in [1], & x in [2]
if (board.at(0) == 'x') { boards[2] |= (1 << 22); } else if (board.at(0) == 'W') { boards[0] |= (1 << 22); }
⋅
⋅
⋅
if (board.at(22) == 'x') { boards[2] |= (1 << 0); } else if (board.at(22) == 'W') { boards[0] |= (1 << 0); }
boards[1] = ~(boards[0] | boards[2]) - 4286578688; // Take W's & x's compliment - 4286578688 to get 2163730
printf("%d | %d | %dn",boards[0], boards[1], boards[2]); // Expected Output: "1351744 | 2163730 | 4873133"
有没有其他技巧可以进一步优化这个过程的速度?我不太关心文件大小。
最后,我该如何将电路板[W,B,x]转换回字符串?(例如,玩家"W"在位置22添加了一个棋子,导致boards[] = {1351745, 2163730, 4873132}
。如何将其转换为:board = xBWxWxBWxWxxBxxxWxBxxBW
?(
编辑:我获得了返回到具有以下功能的板的功能:
char state[23];
for (int i = 0, j = 22; i < 23; ++i, --j) {
if (boards[2] & (1 << j)) { state[i] = 'x'; } else if (boards[0] & (1 << j)) { state[i] = 'W'; } else { state[i] = 'B'; }
}
您在评论中提到您是新手。我认为你需要有很多背景知识才能做出明智的优化决策。
首先,编译器是很好的优化器。他们内置了控制流分析、内联、执行重新排序等等。它们可以根据c++标准提供的保证进行优化。查找未定义的行为优化和优化以及指针别名,作为了解编译器可以做什么和不能做什么进行优化的起点。
其次,如果不进行基准测试,就无法知道您的更改是否真的提高了程序的速度。正如您所提到的,探查器可以帮助您找出程序中需要花费的时间。
第三,你提到你听过";字符串很慢";。你应该问的一个问题是";与什么相比"std::string
数据是在堆上分配的(除非它符合短字符串优化条件,这是一些编译器可以为您做的另一件事(。我认为慢意味着它必须从堆中加载,并在增长字符串时进行新的分配。分配是缓慢的,如果速度可能的话,应该避免。您可以定义的一件事是std::string::reserve
,它是您期望字符串的最大大小。这将分配一次内存,而不是在添加时动态增长内存,这将导致一次或多次分配。查找堆栈与堆、分配成本和缓存未命中。
TL;DR:基准测试和实验,在你试图智胜编译器之前增长你的知识。
- 将空基类优化对象强制转换为另一种类型是否会破坏严格的别名?
- C++优化从 int 到 float 的数组转换
- 关于使用类型转换优化除法代码的问题
- SSE2优化用于从RGB565转换为RGB888(无alpha通道)
- Arm GNU编译器:通过多余的强制转换优化的三进制生成的程序集
- 现代编译器优化如何将递归转换为返回常数
- 在代码优化过程中,C++11编译器是否会在可能的情况下将局部变量转换为右值
- 在turbo c++中,可以将一个普通递归函数转换为尾递归函数来对其进行优化
- 使用SSE2优化RGB565到RGB888的转换
- 通过将"goto"转换为分支机构进行优化
- Visual Studio 编译器优化,用于 C++ 中的类型转换
- F2C 转换的代码中断,当由编译器优化时C++
- 如何优化 YUV 到 RGB 颜色转换代码
- 编译器如何优化不正确C++分层向下转换以导致真正的未定义行为
- C++转换优化
- 为什么将条件写转换为无条件写不是线程安全的优化?
- VS是否优化了对相同类型的强制转换?
- 隐式构造函数转换的编译器优化
- 优化转换算法
- Matlab到OpenCV的转换-优化