我使用的Visual Studio編寫Windows中的類時,它的一個公共職能有很大的for循環看起來像下面,慢循環使用地板和std ::設置
void brain_network_opencl::block_filter_fcd_all(int m)
{
const int m_block_len = m * block_len;
time_t start, end;
for (int j = 0; j < shift_2d_gpu[1]; j++) // local work size/number of rows per block
{
for (int i = 0; i < masksize; i++) // number of extracted voxels
{
if (j + m_block_len != i)
{
//if (floor(dst_ptr_gpu[i + j * masksize] * power_up) > threadhold_fcd)
if ((int)(dst_ptr_gpu[i + j * masksize] * power_up) > threadhold_fcd)
{
org_row = mask_ind[j + m_block_len];
org_col = mask_ind[i];
nodes.insert(org_row);
conns.insert(make_pair(org_row, org_col));
}
}
}
}
end = clock();
cout << end - start << "ms" << " for block" << j << endl;
}
哪裏nodes
是std::set<set>
,conns
是std::multimap<int, int>
和mask_ind
是std::vector<int>
,它們被聲明爲私有變量以及masksize和shift_2d_gpu;
主要時間成本按floor
和.insert
;
問題是,主函數中的相同代碼(包含所有變量)的成本僅比它從這裏調用的時間多1/5〜1次。如果我在函數和main()函數中用floor
替換(int)
,則在這個函數中花費更多;
是什麼原因導致這個問題,我必須把它寫在main()裏面嗎? 順便問一下這跟overloads
有什麼關係? floor
顯示+3 overloads
和.insert
顯示+5 overloads
更新
我這個函數的代碼複製到另一個新的控制檯項目的主要功能。 它仍然比我的第一個功能(代碼也主要)慢得多! 現在我很困惑... 它有什麼設置使floor
和.insert
更快?
更新2014/03/31
這是因爲在項目屬性 - 設置>配置屬性 - > C/C++ - >常規 - >調試信息格式,這個值設置爲P * 程序數據庫編輯並繼續(/ ZI) *爲默認設置,並且與根據msdn進行的大量優化不兼容。如果此值設置爲程序數據庫(/ Zi),則floor
的時間成本不會是(int)的10倍。
(我看着拆卸並發現代碼的長度(call floor
- >jmp floor
- >不同的代碼)是當設置被改變的不同,這就是原因導致floor
和.insert
花了更多的時間比它應該)
可能會感興趣:[爲什麼floor()如此緩慢?](http://stackoverflow.com/questions/824118/why-是樓那麼慢)。 – Gassa
這不是我要找的答案,謝謝你的努力。 – kbxu