gpt4 book ai didi

C++:如何为模板类创建小型速度测试?

转载 作者:行者123 更新时间:2023-11-30 04:33:01 25 4
gpt4 key购买 nike

首先,我将展示我的想法,我想知道如果您认为我的解决方案有风险、糟糕且无能,您会怎么想。我们有一个正常的标准 map 。我们想让多线程读/写操作安全。并测试其速度。对于 boost,我们有 2 个选项使用 - mutable boost::mutexboost::shared_mutex。所以这就是我想出的……

我创建了一个 test interface data structure , , map with scoped_locks , map with shared_locks .现在是有趣的部分 - 如何用最少的代码量测试它们?

我已经创建了一个测试用例:

    template< typename  t1, typename  t2>
void test(t1 k1, t2 v1)
{
map_t_1 k = boost::lexical_cast<map_t_1>(k1);
map_t_2 v = boost::lexical_cast<map_t_2>(v1);

Ds.put(k, v);
if (Ds.containsKey(k))
{
Ds.get(k);
Ds.get(k);
Ds.get(k);
}
Ds.remove(k);
}

和测试:(恕我直言,这是最无能的部分)

    void test_int( int i)
{
boost::shared_lock<boost::shared_mutex> lock_r(results);
boost::shared_lock<boost::shared_mutex> lock(tests);
test<int, int>(i, i);
}

void test_string( std::string s)
{
s += "abcdefghigklmnop";
std::string r = "abcdefghigklmnop" + s;

boost::shared_lock<boost::shared_mutex> lock_r(results);
boost::shared_lock<boost::shared_mutex> lock(tests);
test<std::string, std::string>(s, r);
}

我让创建 tet 的程序员选择使用字符串或 int 测试:

    //code inside tester class
void submit_test( int test_number )
{
if (test_type == "int")
{
io_service.post(boost::bind(&test_map_wraper_pooled<map_wraper_t, map_t_1, map_t_2>::test_int, this, test_number));
}
else if (test_type == "string")
{
io_service.post(boost::bind(&test_map_wraper_pooled<map_wraper_t, map_t_1, map_t_2>::test_string, this, boost::lexical_cast<std::string>(test_number)));
}
}

// code programer can write to test my map on ints
test_map_wraper_pooled<general_map_data_structure<int, int>, int, int > GeneralMapTest(tasks_n);
GeneralMapTest.start_tests("int");
//or on strings
test_map_wraper_pooled<general_map_data_structure<std::string, std::string>, std::string, std::string > GeneralMapTest(tasks_n);
GeneralMapTest.start_tests("string");

这是我的 tester类,和 main应用示例。

所以这就是我想出的用于快速和肮脏的类型类测试的方法。您怎么看 - 是否可以创建小型测试套件,而无需在测试代码中进行动态类型转换以供全部编译?

最佳答案

如果您尝试衡量两种不同实现的性能,您可能应该使用模拟类在压力下的预期行为的测试。这可能涉及比 putcontainsget 多得多的操作;得到; get;remove,可能会循环运行一段时间。我也不太明白为什么 lexical_cast 或者为什么测试正在执行锁,锁没有在 map 内部处理吗?

请注意,向容器添加锁定不会使容器线程安全,您需要调整接口(interface),并且以异常安全的方式执行此操作并非易事。您不显示类的接口(interface),用例也不显示它们(get 返回的类型是什么?)但是您应该知道容器中的任何操作都不应产生容器中的引用或指针,因为这会破坏线程安全。

关于C++:如何为模板类创建小型速度测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7267434/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com