国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Java使用數(shù)組的速度比C ++中std :: vector快8倍。我做錯(cuò)什么了?

瀏覽:93日期:2024-04-29 17:33:27
如何解決Java使用數(shù)組的速度比C ++中std :: vector快8倍。我做錯(cuò)什么了??

這是C ++版本,其中每個(gè)節(jié)點(diǎn)的數(shù)據(jù)收集到一個(gè)結(jié)構(gòu)中,并使用該結(jié)構(gòu)的單個(gè)向量:

#include <vector>#include <cmath>#include <iostream>class Floodisolation {public: Floodisolation() : numberOfCells(20000), data(numberOfCells) { } ~Floodisolation(){ } void isUpdateNeeded() { for (int i = 0; i < numberOfCells; ++i) { data[i].h = data[i].h + 1; data[i].floodedCells = !data[i].floodedCells; data[i].floodedCellsTimeInterval = !data[i].floodedCellsTimeInterval; data[i].qInflow = data[i].qInflow + 1; data[i].qStartTime = data[i].qStartTime + 1; data[i].qEndTime = data[i].qEndTime + 1; data[i].lowerFloorCells = data[i].lowerFloorCells + 1; data[i].cellLocationX = data[i].cellLocationX + 1; data[i].cellLocationY = data[i].cellLocationY + 1; data[i].cellLocationZ = data[i].cellLocationZ + 1; data[i].levelOfCell = data[i].levelOfCell + 1; data[i].valueOfCellIds = data[i].valueOfCellIds + 1; data[i].h0 = data[i].h0 + 1; data[i].vU = data[i].vU + 1; data[i].vV = data[i].vV + 1; data[i].vUh = data[i].vUh + 1; data[i].vVh = data[i].vVh + 1; data[i].vUh0 = data[i].vUh0 + 1; data[i].vVh0 = data[i].vVh0 + 1; data[i].ghh = data[i].ghh + 1; data[i].sfx = data[i].sfx + 1; data[i].sfy = data[i].sfy + 1; data[i].qIn = data[i].qIn + 1; for(int j = 0; j < nEdges; ++j) {data[i].flagInterface[j] = !data[i].flagInterface[j];data[i].typeInterface[j] = data[i].typeInterface[j] + 1;data[i].neighborIds[j] = data[i].neighborIds[j] + 1; } } }private: const int numberOfCells; static const int nEdges = 6; struct data_t { bool floodedCells = 0; bool floodedCellsTimeInterval = 0; double valueOfCellIds = 0; double h = 0; double h0 = 0; double vU = 0; double vV = 0; double vUh = 0; double vVh = 0; double vUh0 = 0; double vVh0 = 0; double ghh = 0; double sfx = 0; double sfy = 0; double qInflow = 0; double qStartTime = 0; double qEndTime = 0; double qIn = 0; double nx = 0; double ny = 0; double floorLevels = 0; int lowerFloorCells = 0; bool floorCompleteleyFilled = 0; double cellLocationX = 0; double cellLocationY = 0; double cellLocationZ = 0; int levelOfCell = 0; bool flagInterface[nEdges] = {}; int typeInterface[nEdges] = {}; int neighborIds[nEdges] = {}; }; std::vector<data_t> data;};int main() { std::ios_base::sync_with_stdio(false); Floodisolation isolation; clock_t start = clock(); for (int i = 0; i < 400; ++i) { if(i % 100 == 0) { std::cout << i << 'n'; } isolation.isUpdateNeeded(); } clock_t stop = clock(); std::cout << 'Time: ' << difftime(stop, start) / 1000 << 'n';}

現(xiàn)場(chǎng)例子

現(xiàn)在的時(shí)間是Java版本速度的2倍。(846比1631)。

奇怪的是,JIT注意到緩存遍歷整個(gè)地方訪(fǎng)問(wèn)數(shù)據(jù)的燒錄,并將您的代碼轉(zhuǎn)換為邏輯上相似但效率更高的順序。

我還關(guān)閉了stdio同步,這僅在將printf/ scanf與C std::cout和混合使用時(shí)才需要std::cin。碰巧的是,您只打印了一些值,但是C 的默認(rèn)打印行為過(guò)于偏執(zhí)且效率低下。

如果nEdges不是實(shí)際的常數(shù)值,則必須從中刪除3個(gè)“數(shù)組”值struct。那不應(yīng)該造成巨大的性能損失。

struct通過(guò)減小大小對(duì)值進(jìn)行排序,從而減少內(nèi)存占用量(并在無(wú)關(guān)緊要的情況下對(duì)訪(fǎng)問(wèn)進(jìn)行排序),可能還可以提高性能。但是我不確定。

一條經(jīng)驗(yàn)法則是,單個(gè)高速緩存未命中的開(kāi)銷(xiāo)比指令高100倍。安排數(shù)據(jù)具有緩存一致性具有很多價(jià)值。

如果struct無(wú)法將數(shù)據(jù)重新排列到中,則可以將迭代更改為依次遍歷每個(gè)容器。

順便說(shuō)一句,請(qǐng)注意Java和C 版本在它們之間有一些細(xì)微的差異。我發(fā)現(xiàn)的一個(gè)問(wèn)題是Java版本在“ for each edge”循環(huán)中有3個(gè)變量,而C只有2個(gè)變量。我使我的代碼與Java匹配。不知道還有沒(méi)有

解決方法

我有以下帶有幾個(gè)大數(shù)組的Java代碼,這些數(shù)組永遠(yuǎn)不會(huì)改變其大小。它在我的計(jì)算機(jī)上運(yùn)行1100毫秒。

我在C ++中實(shí)現(xiàn)了相同的代碼并使用std::vector。

在我的計(jì)算機(jī)上,運(yùn)行完全相同的代碼的C ++實(shí)現(xiàn)的時(shí)間為8800 ms。我做錯(cuò)了什么,所以運(yùn)行緩慢?

基本上,代碼執(zhí)行以下操作:

for (int i = 0; i < numberOfCells; ++i) {h[i] = h[i] + 1;floodedCells[i] = !floodedCells[i];floodedCellsTimeInterval[i] = !floodedCellsTimeInterval[i];qInflow[i] = qInflow[i] + 1;}

它遍歷大小約為20000的不同數(shù)組。

您可以在以下鏈接下找到這兩種實(shí)現(xiàn):

Java:https://ideone.com/R8KqjTC ++:https://ideone.com/Lu7RpE

(由于時(shí)間限制,在ideone上,我只能運(yùn)行400次而不是2000次循環(huán)。但是即使在這里,也有3次相差)

標(biāo)簽: java
相關(guān)文章:
主站蜘蛛池模板: 521a久久九九久久精品 | 草草草在线观看 | 美女视频大全网站免费 | 特级一级毛片视频免费观看 | 日韩中文字幕免费在线观看 | 午夜mm131美女做爰视频 | 91青草久久久久久清纯 | 成免费网站 | 99在线热播精品免费 | 国产午夜不卡在线观看视频666 | 欧美性高清视频免费看www | 亚洲网站视频在线观看 | 国产真实乱系列2孕妇 | 欧美日韩在线视频不卡一区二区三区 | 国产大片线上免费看 | 久久精品国产亚洲aa | 国产免费播放一区二区 | 美女色黄网站 | 欧美一级片观看 | 男女午夜视频 | 太平公主三级dvd | 欧美日韩一二区 | 三级网站免费观看 | 国产综合精品久久久久成人影 | 亚洲无色 | 亚洲欧美日韩中文字幕在线一区 | 国产孕妇孕交视频在线观看 | 国产视频中文字幕 | 欧美日韩一区二区视频图片 | 久久精品国产精品青草 | 久久久国产精品网站 | 九九热播视频 | 亚洲天堂网在线观看 | 在线免费观看成年人视频 | 国产美女作爱视频 | 99久久99热精品免费观看国产 | 99国产精品农村一级毛片 | 久草在线中文最新视频 | 欧美日韩不卡一区 | 国产欧美日韩不卡一区二区三区 | 色狠狠色综合吹潮 |