@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
g ++로 컴파일하면 약간 느린 결과가 생성됩니다.
0
100
200
300
Time: 0.156
동일한 하드웨어에서 Java 8u45의 컴파일러 / JVM을 사용하면 다음과 같은 결과가 나타납니다.
0
100
200
300
Time: 181
이는 VC ++ 버전보다 약 35 % 느리고 g ++ 버전보다 약 16 % 느립니다.
반복 횟수를 원하는 2000으로 늘리면 차이가 3 %로 떨어집니다.이 경우 C ++의 장점 중 일부는 실제로 실행 자체가 아니라 단순히 더 빠른 로딩 (Java의 지속적인 문제)이라는 것을 암시합니다. 이 경우에 이것은 놀라운 일이 아닙니다. (게시 된 코드에서) 측정되는 계산이 너무 사소해서 대부분의 컴파일러가이를 최적화하기 위해 많은 일을 할 수 있을지 의심 스럽습니다.
std::vector<bool>
공간을 절약하기 위해 요소 당 1 비트를 사용하므로 많은 비트 이동이 발생합니다. 속도를 원하면 멀리 떨어져 있어야합니다.std::vector<int>
대신 사용하십시오 .