- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
首先,我将展示我的想法,我想知道如果您认为我的解决方案有风险、糟糕且无能,您会怎么想。我们有一个正常的标准 map 。我们想让多线程读/写操作安全。并测试其速度。对于 boost,我们有 2 个选项使用 - mutable boost::mutex
或 boost::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");
所以这就是我想出的用于快速和肮脏的类型类测试的方法。您怎么看 - 是否可以创建小型测试套件,而无需在测试代码中进行动态类型转换以供全部编译?
最佳答案
如果您尝试衡量两种不同实现的性能,您可能应该使用模拟类在压力下的预期行为的测试。这可能涉及比 put
、contains
、get 多得多的操作;得到; get;
,remove
,可能会循环运行一段时间。我也不太明白为什么 lexical_cast
或者为什么测试正在执行锁,锁没有在 map 内部处理吗?
请注意,向容器添加锁定不会使容器线程安全,您需要调整接口(interface),并且以异常安全的方式执行此操作并非易事。您不显示类的接口(interface),用例也不显示它们(get
返回的类型是什么?)但是您应该知道容器中的任何操作都不应产生容器中的引用或指针,因为这会破坏线程安全。
关于C++:如何为模板类创建小型速度测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7267434/
我是一名优秀的程序员,十分优秀!