C++ 当我在每一帧中多次使用正则表达式时,FPS会下降
我正在创造一个游戏 我编写了一段代码,在每一帧中使用正则表达式检查字符串是否与其他指定的字符串匹配C++ 当我在每一帧中多次使用正则表达式时,FPS会下降,c++,regex,C++,Regex,我正在创造一个游戏 我编写了一段代码,在每一帧中使用正则表达式检查字符串是否与其他指定的字符串匹配 void function update() { string data[] = {"root", "body_bone", "body", "arm_left", "arm_right", "arm_right_sword", "body_belt", "face", "hair", "leg_left", "leg_right"}; vector<string> a
void function update()
{
string data[] = {"root", "body_bone", "body", "arm_left", "arm_right", "arm_right_sword", "body_belt", "face", "hair", "leg_left", "leg_right"};
vector<string> arrayA(data, end(data));
string data2[] = {"03golden/golden_arm_right_sword", "03golden/golden_arm_right", "03golden/golden_leg_left", "03golden/golden_leg_right", "03golden/golden_body", "03golden/golden_belt", "03golden/golden_arm_left", "face_04", "face_03", "face_02", "face_01", "03golden/golden_hair"};
vector<string> arrayB(data2, end(data2));
for (int i = 0; i < arrayA.size(); i++)
{
for (int j = 0; j < arrayB.size(); j++)
{
string s1 = arrayA[i];
string s2 = arrayB[j];
cmatch results;
stringstream ss;
ss << s1 << "$";
regex pattern(ss.str());
if (regex_search(s2.c_str(), results, pattern))
{
// something process
}
}
}
}
void函数更新()
{
字符串数据[]={“根”、“体骨”、“体”、“臂左”、“臂右”、“臂右”、“体带”、“脸”、“头发”、“腿左”、“腿右”};
矢量阵列(数据,结束(数据));
字符串数据2[]={“03golden/golden\u arm\u right\u剑”、“03golden/golden\u arm\u right”、“03golden/golden\u leg\u left”、“03golden/golden\u leg\u right”、“03golden/golden\u腰带”、“03golden/golden\u arm\u left”、“face\u 04”、“face\u 03”、“face\u 02”、“face\u 01”、“03golden/golden\u头发”};
向量arrayB(data2,end(data2));
对于(int i=0;i
您可能根本不想使用正则表达式来实现这一点,简单字符串rfind
会更快,甚至可以改进,但在不知道如何运行它的情况下,很难说。尝试类似的方法,看看它是否改进了FPS:
#include <string>
#include <vector>
#include <iostream>
void update()
{
std::vector<std::string> arrayA = { "root", "body_bone", "body", "arm_left", "arm_right", "arm_right_sword", "body_belt", "face", "hair", "leg_left", "leg_right" };
std::vector<std::string> arrayB = { "03golden/golden_arm_right_sword", "03golden/golden_arm_right", "03golden/golden_leg_left", "03golden/golden_leg_right", "03golden/golden_body", "03golden/golden_belt", "03golden/golden_arm_left", "face_04", "face_03", "face_02", "face_01", "03golden/golden_hair" };
size_t pos;
for (auto const &s1 : arrayA)
for (auto const &s2 : arrayB)
if ((pos = s2.rfind(s1)) != std::string::npos && pos == s2.size() - s1.size())
std::cout << s1 << " => " << s2 << "\n";
}
int main()
{
update();
}
正则表达式功能强大,但在性能方面过于复杂和昂贵。特别是如果像您一样,它们在嵌套循环中被多次重新编译。我的猜测是,您根本不需要正则表达式,似乎您可以使用,例如,在不相关的情况下,您不需要临时数组,您可以uld同样容易做到static const vector arrayA={“root”,“body_bone”,…}
我认为内存分配比正则表达式对你的伤害更大。@Someprogrammerdude Regex并不一定昂贵。如果你有一种允许所有格和/或原子组的语言,Regex基本上可以和解析器函数一样高效。也就是说,它并不总是最好的工具,尤其是当implefind
就足够了。如果你移动string s1=arrayA[i],事情会快得多;
和内部循环外部正则表达式的构造。这两个表达式只依赖于i
的值,因此不必为j
的每个值重新计算。但是如果不使用正则表达式进行简单的字符串搜索,事情会更快。正如您所想,当我使用它时,性能会更快ed rfind。我知道正则表达式很昂贵,所以我想小心处理正则表达式。谢谢你的建议
body => 03golden/golden_body
arm_left => 03golden/golden_arm_left
arm_right => 03golden/golden_arm_right
arm_right_sword => 03golden/golden_arm_right_sword
hair => 03golden/golden_hair
leg_left => 03golden/golden_leg_left
leg_right => 03golden/golden_leg_right