जैसा कि @Stefan ने @ CaptainGiraffe के उत्तर पर एक टिप्पणी में अनुमान लगाया है, आप वैक्टर की एक संरचना के बजाय एक वेक्टर के पैटर्न का उपयोग करके काफी लाभ प्राप्त करते हैं। सही कोड इस तरह दिखता है:
#include <vector>
#include <cmath>
#include <iostream>
#include <time.h>
class FloodIsolation {
public:
FloodIsolation() :
h(0),
floodedCells(0),
floodedCellsTimeInterval(0),
qInflow(0),
qStartTime(0),
qEndTime(0),
lowerFloorCells(0),
cellLocationX(0),
cellLocationY(0),
cellLocationZ(0),
levelOfCell(0),
valueOfCellIds(0),
h0(0),
vU(0),
vV(0),
vUh(0),
vVh(0),
vUh0(0),
vVh0(0),
ghh(0),
sfx(0),
sfy(0),
qIn(0),
typeInterface(nEdges, 0),
neighborIds(nEdges, 0)
{
}
~FloodIsolation(){
}
void Update() {
h = h + 1;
floodedCells = !floodedCells;
floodedCellsTimeInterval = !floodedCellsTimeInterval;
qInflow = qInflow + 1;
qStartTime = qStartTime + 1;
qEndTime = qEndTime + 1;
lowerFloorCells = lowerFloorCells + 1;
cellLocationX = cellLocationX + 1;
cellLocationY = cellLocationY + 1;
cellLocationZ = cellLocationZ + 1;
levelOfCell = levelOfCell + 1;
valueOfCellIds = valueOfCellIds + 1;
h0 = h0 + 1;
vU = vU + 1;
vV = vV + 1;
vUh = vUh + 1;
vVh = vVh + 1;
vUh0 = vUh0 + 1;
vVh0 = vVh0 + 1;
ghh = ghh + 1;
sfx = sfx + 1;
sfy = sfy + 1;
qIn = qIn + 1;
for(int j = 0; j < nEdges; ++j) {
++typeInterface[j];
++neighborIds[j];
}
}
private:
static const int nEdges = 6;
bool floodedCells;
bool floodedCellsTimeInterval;
std::vector<int> neighborIds;
double valueOfCellIds;
double h;
double h0;
double vU;
double vV;
double vUh;
double vVh;
double vUh0;
double vVh0;
double ghh;
double sfx;
double sfy;
double qInflow;
double qStartTime;
double qEndTime;
double qIn;
double nx;
double ny;
double floorLevels;
int lowerFloorCells;
bool flagInterface;
std::vector<int> typeInterface;
bool floorCompleteleyFilled;
double cellLocationX;
double cellLocationY;
double cellLocationZ;
int levelOfCell;
};
int main() {
std::vector<FloodIsolation> isolation(20000);
clock_t start = clock();
for (int i = 0; i < 400; ++i) {
if(i % 100 == 0) {
std::cout << i << "\n";
}
for (auto &f : isolation)
f.Update();
}
clock_t stop = clock();
std::cout << "Time: " << difftime(stop, start) / 1000 << "\n";
}
VC ++ 2015 CTP से संकलक के साथ संकलित, का उपयोग करके -EHsc -O2b2 -GL -Qpar
, मुझे इस तरह के परिणाम मिलते हैं:
0
100
200
300
Time: 0.135
जी ++ के साथ संकलन एक परिणाम है जो थोड़ा धीमा है:
0
100
200
300
Time: 0.156
उसी हार्डवेयर पर, जावा 8u45 से कंपाइलर / जेवीएम का उपयोग करने पर मुझे परिणाम मिलते हैं:
0
100
200
300
Time: 181
यह VC ++ से संस्करण की तुलना में लगभग 35% धीमा है, और जी ++ से संस्करण की तुलना में लगभग 16% धीमा है।
यदि हम पुनरावृत्तियों की संख्या को वांछित 2000 तक बढ़ा देते हैं, तो अंतर केवल 3% तक गिर जाता है, यह सुझाव देता है कि इस मामले में C ++ के लाभ का एक हिस्सा केवल तेजी से लोड हो रहा है (जावा के साथ एक बारहमासी समस्या), वास्तव में निष्पादन में ही नहीं। यह मुझे इस मामले में आश्चर्यचकित नहीं करता है - गणना (पोस्ट किए गए कोड में) की गणना इतनी तुच्छ है कि मुझे संदेह है कि अधिकांश कंपाइलर इसे अनुकूलित करने के लिए पूरी तरह से कर सकते हैं।
std::vector<bool>
अंतरिक्ष को बचाने के लिए प्रति तत्व एक बिट का उपयोग करता है, जिससे बहुत अधिक बिट-शिफ्टिंग होती है। यदि आप गति चाहते हैं, तो आपको इससे दूर रहना चाहिए।std::vector<int>
इसके बजाय उपयोग करें ।