#include <iostream>
#include <chrono>
#include <vector>
#include <array>
//Force 1-byte alignment
#pragma pack(push, 1)
struct UnalignedData {
char c;
double d;
int i;
};
#pragma pack(pop)
//aligned and padded by compiler
struct AlignedData {
double d;
int i;
char c;
};
void performance_test(){
const int iterations = static_cast<int>(1e4);
std::vector<UnalignedData> unaligned(iterations) ;
std::vector<AlignedData> aligned(iterations);
std::array<double, iterations> collect;
//initial
for(int i = 0; i < iterations; ++i){
unaligned[i] = {static_cast<char>(i), i * 3.14, i};
aligned[i] = {i * 3.14, i, static_cast<char>(i)};
}
//unaligned
auto start = std::chrono::high_resolution_clock::now();
for(int i = 0; i < iterations; ++i){
collect[i] = unaligned[i].d;
}
auto end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::milli> unaligned_time(end - start);
//aligned
start = std::chrono::high_resolution_clock::now();
for(int i = 0; i < iterations; ++i){
collect[i] = aligned[i].d;
}
end = std::chrono::high_resolution_clock::now();
std::chrono::duration<double, std::milli> aligned_time(end - start);
std::cout << "Exec Time of Unaligned: " << unaligned_time.count() << "ms" << std::endl;
std::cout << "Exec Time of Aligned: " << aligned_time.count() << "ms" << std::endl;
std::cout << "Performance Improvement: " << (unaligned_time.count() / aligned_time.count() -1)*100 << "%" << std::endl;
}
int main(){
performance_test();
return 0;
}
CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGNocm9ubz4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFycmF5PgoKCi8vRm9yY2UgMS1ieXRlIGFsaWdubWVudAojcHJhZ21hIHBhY2socHVzaCwgMSkKc3RydWN0IFVuYWxpZ25lZERhdGEgewoJY2hhciBjOwoJZG91YmxlIGQ7CglpbnQgaTsKfTsKI3ByYWdtYSBwYWNrKHBvcCkKCgovL2FsaWduZWQgYW5kIHBhZGRlZCBieSBjb21waWxlcgpzdHJ1Y3QgQWxpZ25lZERhdGEgewoJZG91YmxlIGQ7CglpbnQgaTsKCWNoYXIgYzsKfTsKCgp2b2lkIHBlcmZvcm1hbmNlX3Rlc3QoKXsKCWNvbnN0IGludCBpdGVyYXRpb25zID0gc3RhdGljX2Nhc3Q8aW50PigxZTQpOwoJc3RkOjp2ZWN0b3I8VW5hbGlnbmVkRGF0YT4gdW5hbGlnbmVkKGl0ZXJhdGlvbnMpIDsKCXN0ZDo6dmVjdG9yPEFsaWduZWREYXRhPiBhbGlnbmVkKGl0ZXJhdGlvbnMpOwogICAgc3RkOjphcnJheTxkb3VibGUsIGl0ZXJhdGlvbnM+IGNvbGxlY3Q7CgogICAgLy9pbml0aWFsCiAgICBmb3IoaW50IGkgPSAwOyBpIDwgaXRlcmF0aW9uczsgKytpKXsKICAgICAgICB1bmFsaWduZWRbaV0gPSB7c3RhdGljX2Nhc3Q8Y2hhcj4oaSksIGkgKiAzLjE0LCBpfTsKICAgICAgICBhbGlnbmVkW2ldID0ge2kgKiAzLjE0LCBpLCBzdGF0aWNfY2FzdDxjaGFyPihpKX07CiAgICB9CgoJLy91bmFsaWduZWQKCWF1dG8gc3RhcnQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKCQoJZm9yKGludCBpID0gMDsgaSA8IGl0ZXJhdGlvbnM7ICsraSl7CgkJY29sbGVjdFtpXSA9IHVuYWxpZ25lZFtpXS5kOwoJfQoJCglhdXRvIGVuZCA9IHN0ZDo6Y2hyb25vOjpoaWdoX3Jlc29sdXRpb25fY2xvY2s6Om5vdygpOwoJc3RkOjpjaHJvbm86OmR1cmF0aW9uPGRvdWJsZSwgc3RkOjptaWxsaT4gdW5hbGlnbmVkX3RpbWUoZW5kIC0gc3RhcnQpOwoJCgkKCS8vYWxpZ25lZAoJc3RhcnQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKCWZvcihpbnQgaSA9IDA7IGkgPCBpdGVyYXRpb25zOyArK2kpewoJCWNvbGxlY3RbaV0gPSBhbGlnbmVkW2ldLmQ7Cgl9CgllbmQgPSBzdGQ6OmNocm9ubzo6aGlnaF9yZXNvbHV0aW9uX2Nsb2NrOjpub3coKTsKCXN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxkb3VibGUsIHN0ZDo6bWlsbGk+IGFsaWduZWRfdGltZShlbmQgLSBzdGFydCk7CgkKCQoJc3RkOjpjb3V0IDw8ICJFeGVjIFRpbWUgb2YgVW5hbGlnbmVkOiAiIDw8IHVuYWxpZ25lZF90aW1lLmNvdW50KCkgPDwgIm1zIiA8PCBzdGQ6OmVuZGw7CglzdGQ6OmNvdXQgPDwgIkV4ZWMgVGltZSBvZiBBbGlnbmVkOiAiIDw8IGFsaWduZWRfdGltZS5jb3VudCgpIDw8ICJtcyIgPDwgc3RkOjplbmRsOwoJc3RkOjpjb3V0IDw8ICJQZXJmb3JtYW5jZSBJbXByb3ZlbWVudDogIiA8PCAodW5hbGlnbmVkX3RpbWUuY291bnQoKSAvIGFsaWduZWRfdGltZS5jb3VudCgpIC0xKSoxMDAgPDwgIiUiIDw8IHN0ZDo6ZW5kbDsKCQoJCn0KCgppbnQgbWFpbigpewoJCglwZXJmb3JtYW5jZV90ZXN0KCk7CglyZXR1cm4gMDsKfQo=