C ++数値型とパフォーマンスの観点からのコンテナー

多くの場合、大量のデータの処理を処理する必要があります。 このメモは、さまざまな操作を考慮に入れた上で、どのコンテナと番号タイプが最も効果的かを説明しています。 書籍では、いずれかのタイプを選択して生産性を向上させる方法への参照が含まれている場合がありますが、具体的な数値は提供されていません。

注釈


そのため、測定に使用されたプロセッサリスト


プログラムのソースコードはこちら
非表示のテキスト
#include <iostream> #include <cstdint> #include <vector> #include <cmath> #include <fstream> #include <ctime> template <typename T> void testValue(T val); template <typename T1, typename T2> void testAssignment(T1 container, T2 val); template <typename T1, typename T2> void testAssignmentCArr(T1 container, T2 val); template <typename T1, typename T2> void testSubtraction(T1 container, T2 val); template <typename T1, typename T2> void testSubtractionCArr(T1 container, T2 val); template <typename T1, typename T2> void testDivision(T1 container, T2 val); template <typename T1, typename T2> void testDivisionCArr(T1 container, T2 val); template <typename T1, typename T2> void testPush(T1 container, T2 val); template <typename T1, typename T2> void testPushCArr(T1 *container, T2 val); using namespace std; const uint16_t ARR_SIZE = 512; ofstream outFile; double cl; vector<unsigned char> vec1(ARR_SIZE); vector<unsigned short> vec2(ARR_SIZE); vector<unsigned int> vec3(ARR_SIZE); vector<unsigned long> vec4(ARR_SIZE); vector<unsigned long long> vec5(ARR_SIZE); vector<uint8_t> vec6(ARR_SIZE); vector<uint16_t> vec7(ARR_SIZE); vector<uint32_t> vec8(ARR_SIZE); vector<uint64_t> vec9(ARR_SIZE); vector<float> vec10(ARR_SIZE); vector<double> vec11(ARR_SIZE); vector<long double> vec12(ARR_SIZE); unsigned char *cArr1 = new unsigned char [ARR_SIZE]; unsigned short *cArr2 = new unsigned short [ARR_SIZE]; unsigned int *cArr3 = new unsigned int [ARR_SIZE]; unsigned long *cArr4 = new unsigned long [ARR_SIZE]; unsigned long long *cArr5 = new unsigned long long [ARR_SIZE]; uint8_t *cArr6 = new uint8_t [ARR_SIZE]; uint16_t *cArr7 = new uint16_t [ARR_SIZE]; uint32_t *cArr8 = new uint32_t [ARR_SIZE]; uint64_t *cArr9 = new uint64_t [ARR_SIZE]; float *cArr10 = new float [ARR_SIZE]; double *cArr11 = new double [ARR_SIZE]; long double *cArr12 = new long double [ARR_SIZE]; int main(int argc, char *argv[]) { outFile.open("result"); testValue((uint8_t) 0xff); testValue((uint16_t) 0xffff); testValue((uint32_t) 0xffffffff); testValue((uint64_t) 0xffffffffffffffff); outFile.close(); } template <typename T> void testValue(T val) { outFile << hex; outFile << endl << " VALUE: 0x" << uint64_t(val) << endl; outFile << dec; outFile << endl << "  ."; outFile << endl << " VEC: "; testAssignment(vec1, val); testAssignment(vec2, val); testAssignment(vec3, val); testAssignment(vec4, val); testAssignment(vec5, val); testAssignment(vec6, val); testAssignment(vec7, val); testAssignment(vec8, val); testAssignment(vec9, val); testAssignment(vec10, val); testAssignment(vec11, val); testAssignment(vec12, val); outFile << endl << " CARR: "; testAssignmentCArr(cArr1, val); testAssignmentCArr(cArr2, val); testAssignmentCArr(cArr3, val); testAssignmentCArr(cArr4, val); testAssignmentCArr(cArr5, val); testAssignmentCArr(cArr6, val); testAssignmentCArr(cArr7, val); testAssignmentCArr(cArr8, val); testAssignmentCArr(cArr9, val); testAssignmentCArr(cArr10, val); testAssignmentCArr(cArr11, val); testAssignmentCArr(cArr12, val); outFile << endl << "  ."; outFile << endl << " VEC: "; testSubtraction(vec1, 8); testSubtraction(vec2, 8); testSubtraction(vec3, 8); testSubtraction(vec4, 8); testSubtraction(vec5, 8); testSubtraction(vec6, 8); testSubtraction(vec7, 8); testSubtraction(vec8, 8); testSubtraction(vec9, 8); testSubtraction(vec10, 8); testSubtraction(vec11, 8); testSubtraction(vec12, 8); outFile << endl << " CARR: "; testSubtractionCArr(cArr1, 8); testSubtractionCArr(cArr2, 8); testSubtractionCArr(cArr3, 8); testSubtractionCArr(cArr4, 8); testSubtractionCArr(cArr5, 8); testSubtractionCArr(cArr6, 8); testSubtractionCArr(cArr7, 8); testSubtractionCArr(cArr8, 8); testSubtractionCArr(cArr9, 8); testSubtractionCArr(cArr10, 8); testSubtractionCArr(cArr11, 8); testSubtractionCArr(cArr12, 8); outFile << endl << "  ."; outFile << endl << " VEC: "; testDivision(vec1, 2); testDivision(vec2, 2); testDivision(vec3, 2); testDivision(vec4, 2); testDivision(vec5, 2); testDivision(vec6, 2); testDivision(vec7, 2); testDivision(vec8, 2); testDivision(vec9, 2); testDivision(vec10, 2); testDivision(vec11, 2); testDivision(vec12, 2); outFile << endl << " CARR: "; testDivisionCArr(cArr1, 2); testDivisionCArr(cArr2, 2); testDivisionCArr(cArr3, 2); testDivisionCArr(cArr4, 2); testDivisionCArr(cArr5, 2); testDivisionCArr(cArr6, 2); testDivisionCArr(cArr7, 2); testDivisionCArr(cArr8, 2); testDivisionCArr(cArr9, 2); testDivisionCArr(cArr10, 2); testDivisionCArr(cArr11, 2); testDivisionCArr(cArr12, 2); outFile << endl << "     ."; outFile << endl << " VEC: "; testPush(vec1, 4); testPush(vec2, 4); testPush(vec3, 4); testPush(vec4, 4); testPush(vec5, 4); testPush(vec6, 4); testPush(vec7, 4); testPush(vec8, 4); testPush(vec9, 4); testPush(vec10, 4); testPush(vec11, 4); testPush(vec12, 4); outFile << endl << " CARR: "; testPushCArr(cArr1, 4); testPushCArr(cArr2, 4); testPushCArr(cArr3, 4); testPushCArr(cArr4, 4); testPushCArr(cArr5, 4); testPushCArr(cArr6, 4); testPushCArr(cArr7, 4); testPushCArr(cArr8, 4); testPushCArr(cArr9, 4); testPushCArr(cArr10, 4); testPushCArr(cArr11, 4); testPushCArr(cArr12, 4); outFile << endl; } template <typename T1, typename T2> void testAssignment(T1 container, T2 val) { cl = clock(); for (auto &k : container) for (auto &j : container) for (auto &i : container) { i = val; j = val; k = val; } outFile << (clock() - cl) / CLOCKS_PER_SEC << " "; } template <typename T1, typename T2> void testAssignmentCArr(T1 container, T2 val) { cl = clock(); for (uint16_t k = 0; k < ARR_SIZE; k++) for (uint16_t j = 0; j < ARR_SIZE; j++) for (uint16_t i = 0; i < ARR_SIZE; i++) { container[i] = val; container[j] = val; container[k] = val; } outFile << (clock() - cl) / CLOCKS_PER_SEC << " "; } template <typename T1, typename T2> void testSubtraction(T1 container, T2 val) { cl = clock(); for (auto &k : container) for (auto &j : container) for (auto &i : container) { i -= val; j -= val; k -= val; } outFile << (clock() - cl) / CLOCKS_PER_SEC << " "; } template <typename T1, typename T2> void testSubtractionCArr(T1 container, T2 val) { cl = clock(); for (uint16_t k = 0; k < ARR_SIZE; k++) for (uint16_t j = 0; j < ARR_SIZE; j++) for (uint16_t i = 0; i < ARR_SIZE; i++) { container[i] -= val; container[j] -= val; container[k] -= val; } outFile << (clock() - cl) / CLOCKS_PER_SEC << " "; } template <typename T1, typename T2> void testDivision(T1 container, T2 val) { cl = clock(); for (auto &k : container) for (auto &j : container) for (auto &i : container) { i /= val; j /= val; k /= val; } outFile << (clock() - cl) / CLOCKS_PER_SEC << " "; } template <typename T1, typename T2> void testDivisionCArr(T1 container, T2 val) { cl = clock(); for (uint16_t k = 0; k < ARR_SIZE; k++) for (uint16_t j = 0; j < ARR_SIZE; j++) for (uint16_t i = 0; i < ARR_SIZE; i++) { container[i] /= val; container[j] /= val; container[k] /= val; } outFile << (clock() - cl) / CLOCKS_PER_SEC << " "; } template <typename T1, typename T2> void testPush(T1 container, T2 val) { cl = clock(); for (uint16_t j = 0; j < ARR_SIZE; j++) for (uint16_t i = 0; i < ARR_SIZE; i++) { for (int l = 0; l < val; l++) container.push_back(0); } outFile << (clock() - cl) / CLOCKS_PER_SEC << " "; } template <typename T1, typename T2> void testPushCArr(T1 *container, T2 val) { cl = clock(); for (uint16_t j = 0; j < ARR_SIZE; j++) for (uint16_t i = 0; i < ARR_SIZE; i++) { T1 *tmp = new T1 [ARR_SIZE + val]; for (uint16_t l = 0; l < ARR_SIZE + val; l++) { if (l < ARR_SIZE) tmp[l] = container[l]; else tmp[l] = 0; } container = tmp; delete [] tmp; } outFile << (clock() - cl) / CLOCKS_PER_SEC << " "; } 


実行の結果は、4つのテーブルを持つファイルです。 より正確な数値を得るために、測定は7回行われました。 最終的に、結果は平均化されました。

何を見つけましたか?

AMD Athlon 64 X2 4800+



ここで時限リストについて
非表示のテキスト
割り当て操作(std :: vector)

1.フロート(0.17秒)
2.ダブル(0.17秒)
3.ロングダブル(0.17秒)
4.符号なしショート(0.22秒)
5.uint16_t(0.22秒)
6.符号なしlong(0.24秒)
7.uint32_t(0.24秒)
8.符号なし整数(0.25秒)
9.signed char(0.36秒)
10. uint8_t(0.36秒)
11. uint64_t(0.4秒)
12.符号なしlong long(0.41秒)

割り当て操作(cスタイルの配列)

1.符号なしショート(0.16秒)
2. unsigned int(0.16秒)
3. unsigned long(0.16秒)
4. uint32_t(0.16秒)
5.ダブル(0.16秒)
6.ロングダブル(0.16秒)
7.signed char(0.17秒)
8.uint16_t(0.17秒)
9.フロート(0.17秒)
10. uint8_t(0.18秒)
11.符号なしlong long(0.22秒)
12. uint64_t(0.22秒)

減算演算(std :: vector)

1.符号なしショート(0.5秒)
2. uint16_t(0.51秒)
3. unsigned int(0.52秒)
4. unsigned long(0.52秒)
5.uint32_t(0.52秒)
6.unsigned char(0.58秒)
7.uint8_t(0.58秒)
8.ダブル(0.72秒)
9.ロングダブル(0.72秒)
10.フロート(0.74秒)
11.符号なしlong long(1.22秒)
12. uint64_t(1.22秒)

減算演算(cスタイルの配列)

1. unsigned char(0.42秒)
2. uint8_t(0.42秒)
3. uint16_t(0.42秒)
4.符号なしショート(0.44秒)
5.符号なし整数(0.51秒)
6.符号なしlong(0.51秒)
7.uint32_t(0.51秒)
8.ダブル(0.7秒)
9.フロート(0.71秒)
10.ロングダブル(0.71秒)
11.符号なしlong long(1.02秒)
12. uint64_t(1.02秒)

除算演算(std :: vector)

1.フロート(1.4秒)
2.ロングダブル(1.4秒)
3.ダブル(1.44秒)
4.signed int(6.65秒)
5.符号なしlong(6.66秒)
6.uint32_t(6.78秒)
7.signed char(6.97秒)
8.uint8_t(6.97秒)
9.符号なしショート(7秒)
10. uint16_t(7.05秒)
11.uint64_t(16.07秒)
12.符号なしlong long(16.08秒)

除算演算(cスタイルの配列)

1. unsigned char(0.42秒)
2. uint8_t(0.42秒)
3.符号なしショート(0.47秒)
4. uint16_t(0.47秒)
5.符号なし整数(0.5秒)
6.uint32_t(0.5秒)
7.signed long(0.51秒)
8.uint64_t(0.71秒)
9.フロート(0.71秒)
10.ダブル(0.71秒)
11.ロングダブル(0.71秒)
12.符号なしlong long(0.73秒)

配列の最後に要素を追加する(std :: vector)

1. unsigned char(0.01秒)
2.符号なしショート(0.01秒)
3.uint8_t(0.01秒)
4. uint16_t(0.01秒)
5.符号なし整数(0.02秒)
6.符号なしlong(0.02秒)
7. uint32_t(0.02秒)
8.フロート(0.02秒)
9.signed long long(0.03秒)
10. uint64_t(0.03秒)
11.ダブル(0.03秒)
12.ロングダブル(0.03秒)

配列の末尾に要素を追加する(cスタイルの配列)

1. unsigned char(0.36秒)
2. unsigned int(0.36秒)
3. unsigned long(0.36秒)
4.signed long long(0.36秒)
5.uint8_t(0.36秒)
6.uint32_t(0.36秒)
7.uint64_t(0.36秒)
8.フロート(0.36秒)
9.unsigned short(0.42秒)
10. uint16_t(0.42秒)
11.ダブル(0.42秒)
12.ロングダブル(0.42秒)

AMD E2-3000M



ここで時限リストについて
非表示のテキスト
割り当て操作(std :: vector)

1. unsigned char(0.14秒)
2. uint8_t(0.14秒)
3. unsigned int(0.15秒)
4. uint32_t(0.15秒)
5.unsigned short(0.16秒)
6.unsigned long(0.16秒)
7.uint16_t(0.16秒)
8.ダブル(0.22秒)
9.フロート(0.23秒)
10.符号なしlong long(0.24秒)
11. uint64_t(0.24秒)
12.ロングダブル(1.47秒)

割り当て操作(cスタイルの配列)

1. unsigned char(0.18秒)
2. unsigned int(0.18秒)
3. unsigned long(0.18秒)
4. uint8_t(0.18秒)
5.uint32_t(0.18秒)
6.unsigned short(0.19秒)
7.uint16_t(0.19秒)
8.フロート(0.22秒)
9.ダブル(0.22秒)
10.符号なしlong long(0.24秒)
11. uint64_t(0.24秒)
12.ロングダブル(1.47秒)

減算演算(std :: vector)

1.uint32_t(0.51秒)
2. unsigned int(0.52秒)
3. unsigned long(0.52秒)
4.signed char(0.55秒)
5.uint8_t(0.55秒)
6.uint16_t(0.55秒)
7.unsigned short(0.56秒)
8.符号なしlong long(0.7秒)
9.uint64_t(0.7秒)
10.フロート(0.93秒)
11.ダブル(0.93秒)
12.ロングダブル(2.18秒)

減算演算(cスタイルの配列)

1. unsigned int(0.51秒)
2. unsigned long(0.51秒)
3. uint32_t(0.51秒)
4.signed char(0.55秒)
5.unsigned short(0.55秒)
6.uint8_t(0.55秒)
7.uint16_t(0.55秒)
8.符号なしlong long(0.69秒)
9.uint64_t(0.69秒)
10.フロート(0.92秒)
11.ダブル(0.93秒)
12.ロングダブル(2.17秒)

除算演算(std :: vector)

1.符号なし整数(1.96秒)
2. unsigned long(1.96秒)
3. uint32_t(1.96秒)
4.signed char(2.14秒)
5.unsigned short(2.14秒)
6.uint8_t(2.14秒)
7.uint16_t(2.14秒)
8.符号なしlong long(3.65秒)
9.uint64_t(3.65秒)
10.フロート(4.22秒)
11.ダブル(4.22秒)
12.ロングダブル(5.27秒)

除算演算(cスタイルの配列)

1.符号なし整数(1.98秒)
2. unsigned long(1.98秒)
3. uint32_t(1.98秒)
4.signed char(2.16秒)
5.uint16_t(2.16秒)
6.unsigned short(2.17秒)
7.uint8_t(2.17秒)
8.符号なしlong long(3.96秒)
9.uint64_t(3.96秒)
10.フロート(4.22秒)
11.ダブル(4.23秒)
12.ロングダブル(5.29秒)

配列の最後に要素を追加する(std :: vector)

1. unsigned char(0.01秒)
2.符号なしショート(0.01秒)
3.uint8_t(0.01秒)
4. uint16_t(0.01秒)
5.符号なし整数(0.02秒)
6.符号なしlong(0.02秒)
7. uint32_t(0.02秒)
8.フロート(0.02秒)
9.signed long long(0.03秒)
10. uint64_t(0.03秒)
11.ダブル(0.03秒)
12.ロングダブル(0.04秒)

配列の末尾に要素を追加する(cスタイルの配列)

1. unsigned int(0.24秒)
2. unsigned long(0.24秒)
3. uint32_t(0.24秒)
4.ダブル(0.24秒)
5. unsigned long long(0.26秒)
6.uint64_t(0.27秒)
7.signed short(0.31秒)
8.uint16_t(0.31秒)
9.フロート(0.31秒)
10.符号なし文字(0.72秒)
11. uint8_t(0.72秒)
12.ロングダブル(0.73秒)

Intel Core i5-3230M



ここで時限リストについて
非表示のテキスト
割り当て操作(std :: vector)

1.フロート(0.12秒)
2.ダブル(0.12秒)
3.ロングダブル(0.12秒)
4. uint16_t(0.14秒)
5.unsigned short(0.15秒)
6.符号なし整数(0.17秒)
7.signed long(0.17秒)
8.uint32_t(0.17秒)
9.signed char(0.23秒)
10. uint8_t(0.23秒)
11.符号なしlong long(0.28秒)
12. uint64_t(0.28秒)

割り当て操作(cスタイルの配列)

1. unsigned char(0.11秒)
2.unsigned short(0.11秒)
3. unsigned int(0.11秒)
4.signed long(0.11秒)
5.uint8_t(0.11秒)
6.uint32_t(0.11秒)
7.フロート(0.11秒)
8.ダブル(0.11秒)
9.ロングダブル(0.11秒)
10. uint16_t(0.12秒)
11.符号なしlong long(0.22秒)
12. uint64_t(0.22秒)

減算演算(std :: vector)

1.符号なしショート(0.23秒)
2. unsigned int(0.23秒)
3. unsigned long(0.23秒)
4. uint16_t(0.23秒)
5.uint32_t(0.23秒)
6.符号なし文字(0.27秒)
7.uint8_t(0.27秒)
8.フロート(0.33秒)
9.ダブル(0.33秒)
10.ロングダブル(0.33秒)
11.uint64_t(0.41秒)
12.符号なしlong long(0.42秒)

減算演算(cスタイルの配列)

1. unsigned char(0.23秒)
2.符号なしショート(0.23秒)
3. unsigned int(0.23秒)
4. unsigned long(0.23秒)
5.uint8_t(0.23秒)
6.uint16_t(0.23秒)
7.uint32_t(0.23秒)
8. unsigned long long(0.31秒)
9.uint64_t(0.31秒)
10.フロート(0.33秒)
11.ダブル(0.33秒)
12.ロングダブル(0.33秒)

除算演算(std :: vector)

1.フロート(0.77秒)
2.ダブル(0.89秒)
3.ロングダブル(0.89秒)
4.符号なし文字(1秒)
5.符号なしショート(1秒)
6. uint8_t(1秒)
7. uint16_t(1秒)
8.符号なし整数(1.14秒)
9.uint32_t(1.14秒)
10.符号なしlong(1.15秒)
11.符号なしlong long(3.2秒)
12. uint64_t(3.21秒)

除算演算(cスタイルの配列)

1. unsigned char(0.23秒)
2.符号なしショート(0.23秒)
3. unsigned int(0.23秒)
4. unsigned long(0.23秒)
5.uint8_t(0.23秒)
6.uint16_t(0.23秒)
7.uint32_t(0.23秒)
8. unsigned long long(0.26秒)
9.uint64_t(0.26秒)
10.フロート(0.41秒)
11.ダブル(0.41秒)
12.ロングダブル(0.41秒)

配列の最後に要素を追加する(std :: vector)

1. unsigned char(0秒)
2.unsigned short(0秒)
3. uint8_t(0秒)
4. uint16_t(0秒)
5.符号なし整数(0.01秒)
6.符号なしlong(0.01秒)
7.符号なしlong long(0.01秒)
8. uint32_t(0.01秒)
9.uint64_t(0.01秒)
10.フロート(0.01秒)
11.ダブル(0.01秒)
12.ロングダブル(0.01秒)

配列の末尾に要素を追加する(cスタイルの配列)

1.unsigned char(0.13秒)
2.unsigned short(0.13秒)
3. unsigned int(0.13秒)
4. unsigned long long(0.13秒)
5.uint8_t(0.13秒)
6.uint16_t(0.13秒)
7.uint32_t(0.13秒)
8.uint64_t(0.13秒)
9.フロート(0.13秒)
10.ダブル(0.13秒)
11.ロングダブル(0.13秒)
12.符号なしlong(0.16秒)

Intel Pentium CPU B960



ここで時限リストについて
非表示のテキスト
割り当て操作(std :: vector)

1.フロート(0.19秒)
2.ダブル(0.19秒)
3.ロングダブル(0.19秒)
4.符号なしショート(0.23秒)
5.uint16_t(0.23秒)
6.符号なし整数(0.28秒)
7.符号なしlong(0.28秒)
8.uint32_t(0.28秒)
9.signed char(0.4秒)
10. uint8_t(0.4秒)
11.符号なしlong long(0.45秒)
12. uint64_t(0.45秒)

割り当て操作(cスタイルの配列)

1.符号なしショート(0.18秒)
2. unsigned long(0.18秒)
3.ダブル(0.18秒)
4.signed char(0.19秒)
5.符号なし整数(0.19秒)
6.uint8_t(0.19秒)
7.uint16_t(0.19秒)
8.uint32_t(0.19秒)
9.フロート(0.19秒)
10.ロングダブル(0.19秒)
11.符号なしlong long(0.37秒)
12. uint64_t(0.37秒)

減算演算(std :: vector)

1.符号なしショート(0.41秒)
2. unsigned long(0.41秒)
3.uint8_t(0.41秒)
4. uint32_t(0.41秒)
5. unsigned char(0.42秒)
6.符号なし整数(0.42秒)
7.uint16_t(0.42秒)
8.uint64_t(0.53秒)
9.signed long long(0.54秒)
10.フロート(0.55秒)
11.ダブル(0.55秒)
12.ロングダブル(0.55秒)

減算演算(cスタイルの配列)

1.符号なしショート(0.41秒)
2. uint16_t(0.41秒)
3. unsigned char(0.42秒)
4.signed int(0.42秒)
5. unsigned long(0.42秒)
6.uint8_t(0.42秒)
7.uint32_t(0.42秒)
8. unsigned long long(0.51秒)
9.uint64_t(0.51秒)
10.フロート(0.55秒)
11.ダブル(0.55秒)
12.ロングダブル(0.55秒)

除算演算(std :: vector)

1.フロート(1.84秒)
2.ダブル(1.84秒)
3.ロングダブル(1.84秒)
4.符号なしショート(1.97秒)
5.uint16_t(1.97秒)
6.符号なし文字(1.98秒)
7.符号なし整数(1.98秒)
8.符号なしlong(1.98秒)
9.uint8_t(1.98秒)
10. uint32_t(1.98秒)
11.符号なしlong long(4.96秒)
12. uint64_t(4.96秒)

除算演算(cスタイルの配列)

1. unsigned char(0.44秒)
2. unsigned long long(0.44秒)
3.uint8_t(0.44秒)
4.uint64_t(0.44秒)
5.unsigned short(0.45秒)
6.符号なし整数(0.45秒)
7.signed long(0.45秒)
8.uint16_t(0.45秒)
9.uint32_t(0.45秒)
10.フロート(0.68秒)
11.ダブル(0.68秒)
12.ロングダブル(0.68秒)

配列の最後に要素を追加する(std :: vector)

1. unsigned char(0秒)
2.符号なしショート(0.01秒)
3. unsigned int(0.01秒)
4. unsigned long(0.01秒)
5.uint8_t(0.01秒)
6.uint16_t(0.01秒)
7. uint32_t(0.01秒)
8.フロート(0.01秒)
9.signed long long(0.02秒)
10. uint64_t(0.02秒)
11.ダブル(0.02秒)
12. long double(0.02秒)

配列の末尾に要素を追加する(cスタイルの配列)

1. unsigned char(0.21秒)
2.符号なしショート(0.21秒)
3. unsigned int(0.21秒)
4. uint8_t(0.21秒)
5.uint16_t(0.21秒)
6.uint32_t(0.21秒)
7.uint64_t(0.21秒)
8.ダブル(0.21秒)
9.ロングダブル(0.21秒)
10.符号なしlong long(0.22秒)
11.フロート(0.22秒)
12.符号なしlong(0.23秒)

Intel Pentium CPU G850



ここで時限リストについて
非表示のテキスト
割り当て操作(std :: vector)

1.符号なしショート(0.14秒)
2. unsigned int(0.14秒)
3. unsigned long(0.14秒)
4.signed long long(0.14秒)
5.uint8_t(0.14秒)
6.uint16_t(0.14秒)
7.uint32_t(0.14秒)
8.uint64_t(0.14秒)
9.フロート(0.14秒)
10.ダブル(0.14秒)
11.符号なし文字(0.15秒)
12.ロングダブル(0.81秒)

割り当て操作(cスタイルの配列)

1.フロート(0.14秒)
2.ダブル(0.14秒)
3.unsigned short(0.18秒)
4.signed long(0.18秒)
5. unsigned long long(0.18秒)
6.uint16_t(0.18秒)
7.uint64_t(0.18秒)
8.unsigned char(0.19秒)
9.signed int(0.19秒)
10. uint8_t(0.19秒)
11. uint32_t(0.19秒)
12.ロングダブル(0.79秒)

減算演算(std :: vector)

1. unsigned char(0.31秒)
2.符号なしショート(0.31秒)
3. unsigned int(0.31秒)
4.signed long(0.31秒)
5. unsigned long long(0.31秒)
6.uint8_t(0.31秒)
7.uint16_t(0.31秒)
8.uint32_t(0.31秒)
9.uint64_t(0.31秒)
10.フロート(0.42秒)
11.ダブル(0.42秒)
12.ロングダブル(0.97秒)

減算演算(cスタイルの配列)

1. unsigned char(0.33秒)
2.符号なしショート(0.33秒)
3. unsigned int(0.33秒)
4.signed long(0.33秒)
5. unsigned long long(0.33秒)
6.uint8_t(0.33秒)
7.uint16_t(0.33秒)
8.uint32_t(0.33秒)
9.uint64_t(0.33秒)
10.フロート(0.42秒)
11.ダブル(0.42秒)
12.ロングダブル(0.98秒)

除算演算(std :: vector)

1.フロート(1.4秒)
2.ダブル(1.4秒)
3.ロングダブル(1.4秒)
4.符号なし整数(1.49秒)
5.uint32_t(1.49秒)
6.符号なしショート(1.5秒)
7.uint16_t(1.5秒)
8.unsigned char(1.51秒)
9.uint8_t(1.51秒)
10.符号なしlong(3.33秒)
11.符号なしlong long(3.33秒)
12. uint64_t(3.33秒)

除算演算(cスタイルの配列)

1.フロート(1.4秒)
2.ダブル(1.4秒)
3.ロングダブル(1.41秒)
4.符号なし整数(1.49秒)
5.uint32_t(1.49秒)
6.unsigned char(1.51秒)
7.signed short(1.51秒)
8.uint8_t(1.51秒)
9.uint16_t(1.51秒)
10.符号なしlong long(3.24秒)
11. uint64_t(3.24秒)
12.符号なしlong(3.25秒)

配列の最後に要素を追加する(std :: vector)

1. unsigned char(0秒)
2.unsigned short(0秒)
3. uint8_t(0秒)
4. uint16_t(0秒)
5.符号なし整数(0.01秒)
6.符号なしlong(0.01秒)
7.符号なしlong long(0.01秒)
8. uint32_t(0.01秒)
9.uint64_t(0.01秒)
10.フロート(0.01秒)
11.ダブル(0.01秒)
12. long double(0.02秒)

配列の末尾に要素を追加する(cスタイルの配列)

1. unsigned char(0.15秒)
2. unsigned long(0.15秒)
3. unsigned long long(0.15秒)
4. uint8_t(0.15秒)
5.uint64_t(0.15秒)
6.ダブル(0.15秒)
7.signed short(0.16秒)
8.符号なし整数(0.16秒)
9.uint16_t(0.16秒)
10. uint32_t(0.16秒)
11.フロート(0.16秒)
12.ロングダブル(0.48秒)

std :: vectorを使用する場合

算術演算の数が最小化され、要素を追加する演算が豊富に適用される大規模な配列。 それ以外の場合は、クラシック配列が優先されます。

しかし、数値型はどうですか? どちらがより速く、どれがより遅いですか?

正確な答えはありません。 結果によると、unsigned long long / uint64_tについてはほんの一言しか言えません。 これらのタイプは、4バイトを超える範囲の数値を保存する必要がある場合に役立ちます。 それ以外の場合は、パフォーマンスが低下し、非常に目立つため、拒否する方が適切です。

Source: https://habr.com/ru/post/J265323/


All Articles