zl程序教程

您现在的位置是:首页 >  其他

当前栏目

如何让C++字符串更快

2023-03-07 09:09:30 时间

1、上代码,原有写法

#include <iostream>
#include <string>


static uint32_t s_AllocCount = 0;

void* operator new(size_t size) 
{
	s_AllocCount++;
	std::cout << "Allocating " << size << " bytes\n";
	return malloc(size);
}

void PrintName(const std::string& name) 
{

	std::cout << name << std::endl;
}


int main() 
{
	std::string name = "Yan Chernikov";
	PrintName(name);
	std::string firstName = name.substr(0, 3);
	std::string lastName = name.substr(4, 9);
	

	std::cout << s_AllocCount << " allocations" << std::endl;

	std::cin.get();
}

1.1、运行结果

分配了三次内存

std::string name ="Yan Chernikov";

PrintName(name);

std::string firstName = name.substr(0,3);

std::string lastName = name.substr(4,9);

2、第一次优化

2.1、代码

#include <iostream>
#include <string>


static uint32_t s_AllocCount = 0;

void* operator new(size_t size)
{
	s_AllocCount++;
	std::cout << "Allocating " << size << " bytes\n";
	return malloc(size);
}

void PrintName(std::string_view name)
{

	std::cout << name << std::endl;
}


int main()
{
	std::string name = "Yan Chernikov";

#if 0
	std::string firstName = name.substr(0, 3);
	std::string lastName = name.substr(4, 9);
#else
	std::string_view firstName(name.c_str(), 3);
	std::string_view lastName(name.c_str() + 4, 9);
#endif

	PrintName(firstName);
	PrintName(lastName);
	std::cout << s_AllocCount << " allocations" << std::endl;

	std::cin.get();
}

2.2 运行结果

image.png

2.3、用string_view 替换string

3、第二次优化

3.1、代码

#include <iostream>
#include <string>


static uint32_t s_AllocCount = 0;

void* operator new(size_t size)
{
	s_AllocCount++;
	std::cout << "Allocating " << size << " bytes\n";
	return malloc(size);
}

void PrintName(std::string_view name)
{

	std::cout << name << std::endl;
}


int main()
{
	const char* name = "Yan Chernikov";

#if 0
	std::string firstName = name.substr(0, 3);
	std::string lastName = name.substr(4, 9);
#else
	std::string_view firstName(name, 3);
	std::string_view lastName(name + 4, 9);
#endif

	PrintName("firstName");
	PrintName("lastName");
	std::cout << s_AllocCount << " allocations" << std::endl;

	std::cin.get();
}

3.2、运行结果

image.png

3.3、修改的代码

const char* name = "Yan Chernikov";
std::string_view firstName(name, 3);
std::string_view lastName(name + 4, 9);
PrintName("firstName");
PrintName("lastName");

4、第二次修改(const char* name = "Yan Chernikov";)在只能使用string且数据量较大的情况下,是不方便的。

我们要做的是修改PrintName函数中的参数为PrintName(std::string_view nam),分配次数就可以从1变成0了。

4.1、代码

#include <iostream>
#include <string>


static uint32_t s_AllocCount = 0;

void* operator new(size_t size)
{
	s_AllocCount++;
	std::cout << "Allocating " << size << " bytes\n";
	return malloc(size);
}

void PrintName(std::string_view name)
{

	std::cout << name << std::endl;
}


int main()
{
	const char* name = "Yan Chernikov";

#if 0
	std::string firstName = name.substr(0, 3);
	std::string lastName = name.substr(4, 9);
#else
	std::string_view firstName(name, 3);
	std::string_view lastName(name + 4, 9);
#endif
	PrintName(name);
	/*PrintName("firstName");
	PrintName("lastName");*/
	std::cout << s_AllocCount << " allocations" << std::endl;

	std::cin.get();
}

4.2、运行结果:

image.png

5、总结

像这种在C++中,尤其是多个循环中,使用string是非常影响性能的,如果可以使用string_view,则可以有效提示效率,加快运行速度。