C++ C+的性能问题+;(使用VC+;+;2010):在运行时,我的程序似乎随机等待了一段时间

C++ C+的性能问题+;(使用VC+;+;2010):在运行时,我的程序似乎随机等待了一段时间,c++,visual-c++-2010,C++,Visual C++ 2010,我目前正试图为一个车辆路径问题编写某种动态规划方法。在某一点上,我有一个部分路由,我想添加到minmaxheap中,以便在同一阶段保持最好的100个部分路由。大多数程序运行平稳,但当我真的想在堆中插入部分路由时,事情往往会变得有点慢。具体代码如下所示: clock_t insert_start, insert_finish, check1_finish, check2_finish; insert_start = clock(); check2_finish = clock(); if(h

我目前正试图为一个车辆路径问题编写某种动态规划方法。在某一点上,我有一个部分路由,我想添加到minmaxheap中,以便在同一阶段保持最好的100个部分路由。大多数程序运行平稳,但当我真的想在堆中插入部分路由时,事情往往会变得有点慢。具体代码如下所示:

 clock_t insert_start, insert_finish, check1_finish, check2_finish;

insert_start = clock();
check2_finish = clock();

if(heap.get_vector_size() < 100) {
    check1_finish= clock();
    heap.insert(expansion);
    cout << "node added" << endl;
}
else {
    check1_finish = clock();
    if(expansion.get_cost() < heap.find_max().get_cost() ) {
        check2_finish = clock();
        heap.delete_max();
        heap.insert(expansion);
        cout<< "worst node deleted and better one added"   <<endl;
    }
    else {
        check2_finish = clock();
        cout << "cost too high check"<<endl;
    }
}

number_expansions++;

cout << "check 1 takes " << check1_finish - insert_start << " ms" << endl;
cout << "check 2 takes " << check2_finish - check1_finish << "ms " << endl;

insert_finish = clock();

cout << "Inserting an expanded state into the heap takes " << insert_finish - insert_start << " clocks" << endl;
我知道当这个程序块使用其他地方实现的函数时,很难对代码说点什么,但我很震惊,为什么这有时需要不到一毫秒,有时需要16毫秒。程序应该执行这个程序块数千次,所以这些小故障真的大大降低了速度

我唯一的猜测是,heap类中的vector存储了所有这些状态,但我使用vector::reserve在构造函数中为100个项保留了位置,所以我不认为这仍然是个问题


谢谢

抢占。您的程序可能被操作系统抢占,因此其他一些程序可以运行一段时间

此外,它不是16毫秒,而是16个时钟滴答声:

如果您想要ms,您需要执行以下操作:

cout << "Inserting an expanded state into the heap takes "
     << (insert_finish - insert_start) * 1000 / CLOCKS_PER_SEC
     << " ms " << endl;

cout抢占。您的程序可能被操作系统抢占,因此其他一些程序可以运行一段时间

此外,它不是16毫秒,而是16个时钟滴答声:

如果您想要ms,您需要执行以下操作:

cout << "Inserting an expanded state into the heap takes "
     << (insert_finish - insert_start) * 1000 / CLOCKS_PER_SEC
     << " ms " << endl;

cout看起来您是在测量“墙时间”,而不是CPU时间。Windows本身不是实时操作系统。像设备驱动程序这样的高优先级事物偶尔会引起大的打嗝并不少见


在Windows上,如果我手动查找代码中的瓶颈,我会使用。最好不要手动操作,而是使用探查器。

看起来您是在测量“墙时间”,而不是CPU时间。Windows本身不是实时操作系统。像设备驱动程序这样的高优先级事物偶尔会引起大的打嗝并不少见

在Windows上,如果我手动查找代码中的瓶颈,我会使用。更好的做法是不要手动操作,而是使用探查器

我唯一的猜测是 与堆中的向量一起发生 类,该类存储所有这些状态,但 我在房间里预订了100件物品的位置 使用vector::reserve so I的构造函数 我不明白这怎么会是一场灾难 问题

您是否使用std::vector来实现它?Insert为std::vector占用线性时间。此外,如果不使用已排序的容器,则删除max is可能需要一些时间

我建议您使用std::set或std::multiset。插入、删除和查找take always ln(n)

我唯一的猜测是 与堆中的向量一起发生 类,该类存储所有这些状态,但 我在房间里预订了100件物品的位置 使用vector::reserve so I的构造函数 我不明白这怎么会是一场灾难 问题

您是否使用std::vector来实现它?Insert为std::vector占用线性时间。此外,如果不使用已排序的容器,则删除max is可能需要一些时间


我建议您使用std::set或std::multiset。插入、删除和查找take always ln(n)。

尝试使用QueryPerformanceCounter测量时间,因为我认为时钟函数不可能非常精确。时钟可能与windows调度程序具有相同的精度-单cpu为10毫秒,多核cpu为15或16毫秒。QueryPerformanceCounter和QueryPerformanceFreq可以提供纳秒分辨率。

尝试使用QueryPerformanceCounter测量时间,因为我认为时钟函数不可能非常精确。时钟可能与windows调度程序具有相同的精度-单cpu为10毫秒,多核cpu为15或16毫秒。QueryPerformanceCounter和QueryPerformanceFreq可以提供纳秒分辨率。

矢量有多大?可能是删除了吗?它们可能代价高昂,尤其是在调试模式下。你试过用deque代替vector吗?vector包含minmaxheap的项,我实现了minmaxheap,特别是它的快速性能。vector有多大?可能是删除了吗?它们可能代价高昂,尤其是在调试模式下。你试过用deque而不是vector吗?vector包含minmaxheap的项,我实现了minmaxheap,特别是它的快速性能。还应该提到的是,时钟资源可能只有16个滴答声。瞧,如果你一直以最优先的顺序检查,你所看到的不是0就是16。这里的时钟每秒似乎是1000,所以假设你可以用它们作为同义词。还有,既然我想报告我的算法占用的cpu时间,我怎么能解决抢占问题呢?@Nightsky-你必须多次执行算法,并计算平均占用的时间。+1分。还应该提到的是,时钟资源可能只有16个滴答声。瞧,如果你一直以最优先的顺序检查,你所看到的不是0就是16。这里的时钟每秒似乎是1000,所以假设你可以用它们作为同义词。还有,既然我想报告我的算法占用的cpu时间,我怎么能绕过抢占呢?@Nightsky-你必须多次执行算法,并计算平均占用的时间。没有插入是自制的minmaxheap类的一部分。没有插入是自制的minmaxheap类的一部分。