Như @Stefan đã đoán trong một bình luận về câu trả lời của @ CaptainGiraffe, bạn thu được kha khá khi sử dụng vectơ cấu trúc thay vì cấu trúc vectơ. Mã đã sửa có dạng như sau:
#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";
}
Được biên dịch bằng trình biên dịch từ VC ++ 2015 CTP, bằng cách sử dụng -EHsc -O2b2 -GL -Qpar
, tôi nhận được kết quả như:
0
100
200
300
Time: 0.135
Biên dịch với g ++ tạo ra kết quả hơi chậm hơn:
0
100
200
300
Time: 0.156
Trên cùng một phần cứng, sử dụng trình biên dịch / JVM từ Java 8u45, tôi nhận được kết quả như:
0
100
200
300
Time: 181
Điều này chậm hơn khoảng 35% so với phiên bản từ VC ++ và chậm hơn khoảng 16% so với phiên bản từ g ++.
Nếu chúng ta tăng số lần lặp đến 2000 mong muốn, sự khác biệt giảm xuống chỉ còn 3%, cho thấy rằng một phần lợi thế của C ++ trong trường hợp này chỉ đơn giản là tải nhanh hơn (một vấn đề lâu năm với Java), không thực sự nằm trong chính việc thực thi. Điều này không làm tôi ngạc nhiên trong trường hợp này - tính toán được đo lường (trong mã đã đăng) quá tầm thường đến mức tôi nghi ngờ hầu hết các trình biên dịch có thể làm rất nhiều để tối ưu hóa nó.
std::vector<bool>
sử dụng một bit cho mỗi phần tử để tiết kiệm dung lượng, dẫn đến nhiều sự thay đổi bit. Nếu bạn muốn tốc độ, bạn nên tránh xa nó. Sử dụngstd::vector<int>
thay thế.