Pull to refresh

Числовые типы и контейнеры C++ с точки зрения производительности

Reading time14 min
Views4.6K
Зачастую всем нам приходится иметь дело с обработкой больших объёмов данных. Эта заметка является рассуждением на тему того, какие контейнеры и числовые типы (с учетом различных операций) лучше всего справляются с этой задачей. В книгах иногда встречаются упоминания о том, как с помощью выбора того или иного типа повысить производительность, но при этом не приводятся конкретные цифры.

Примечания

  • Во внимание берём только время выполнения программы.
  • Программу следует компилировать в release-режиме оптимизации.
  • В целях экономии сил не рассматриваются специфичные контейнеры, входящие в состав STL. Исходим из того, что требуется лишь простая арифметика и добавление элементов.

Итак, перечень процессоров, которые использовались для измерений

  • AMD Athlon 64 X2 4800+
  • AMD E2-3000M
  • Intel Core i5-3230M
  • Intel Pentium CPU B960
  • Intel Pentium CPU G850

За исходным кодом программы сюда
Скрытый текст
#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 << " ";
}


Результат выполнения — файл с четырьмя таблицами. Для получения более точных цифр замеры проводились по семь раз. В конце результаты усреднялись.

Что же удалось выяснить?

AMD Athlon 64 X2 4800+



За упорядоченным по времени списком сюда
Скрытый текст
Операция присваивания (std::vector)

1. float (0.17 сек.)
2. double (0.17 сек.)
3. long double (0.17 сек.)
4. unsigned short (0.22 сек.)
5. uint16_t (0.22 сек.)
6. unsigned long (0.24 сек.)
7. uint32_t (0.24 сек.)
8. unsigned int (0.25 сек.)
9. unsigned char (0.36 сек.)
10. uint8_t (0.36 сек.)
11. uint64_t (0.4 сек.)
12. unsigned long long (0.41 сек.)

Операция присваивания (c-style array)

1. unsigned short (0.16 сек.)
2. unsigned int (0.16 сек.)
3. unsigned long (0.16 сек.)
4. uint32_t (0.16 сек.)
5. double (0.16 сек.)
6. long double (0.16 сек.)
7. unsigned char (0.17 сек.)
8. uint16_t (0.17 сек.)
9. float (0.17 сек.)
10. uint8_t (0.18 сек.)
11. unsigned long long (0.22 сек.)
12. uint64_t (0.22 сек.)

Операция вычитания (std::vector)

1. unsigned short (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. double (0.72 сек.)
9. long double (0.72 сек.)
10. float (0.74 сек.)
11. unsigned long long (1.22 сек.)
12. uint64_t (1.22 сек.)

Операция вычитания (c-style array)

1. unsigned char (0.42 сек.)
2. uint8_t (0.42 сек.)
3. uint16_t (0.42 сек.)
4. unsigned short (0.44 сек.)
5. unsigned int (0.51 сек.)
6. unsigned long (0.51 сек.)
7. uint32_t (0.51 сек.)
8. double (0.7 сек.)
9. float (0.71 сек.)
10. long double (0.71 сек.)
11. unsigned long long (1.02 сек.)
12. uint64_t (1.02 сек.)

Операция деления (std::vector)

1. float (1.4 сек.)
2. long double (1.4 сек.)
3. double (1.44 сек.)
4. unsigned int (6.65 сек.)
5. unsigned long (6.66 сек.)
6. uint32_t (6.78 сек.)
7. unsigned char (6.97 сек.)
8. uint8_t (6.97 сек.)
9. unsigned short (7 сек.)
10. uint16_t (7.05 сек.)
11. uint64_t (16.07 сек.)
12. unsigned long long (16.08 сек.)

Операция деления (c-style array)

1. unsigned char (0.42 сек.)
2. uint8_t (0.42 сек.)
3. unsigned short (0.47 сек.)
4. uint16_t (0.47 сек.)
5. unsigned int (0.5 сек.)
6. uint32_t (0.5 сек.)
7. unsigned long (0.51 сек.)
8. uint64_t (0.71 сек.)
9. float (0.71 сек.)
10. double (0.71 сек.)
11. long double (0.71 сек.)
12. unsigned long long (0.73 сек.)

Добавление элементов в конец массива (std::vector)

1. unsigned char (0.01 сек.)
2. unsigned short (0.01 сек.)
3. uint8_t (0.01 сек.)
4. uint16_t (0.01 сек.)
5. unsigned int (0.02 сек.)
6. unsigned long (0.02 сек.)
7. uint32_t (0.02 сек.)
8. float (0.02 сек.)
9. unsigned long long (0.03 сек.)
10. uint64_t (0.03 сек.)
11. double (0.03 сек.)
12. long double (0.03 сек.)

Добавление элементов в конец массива (c-style array)

1. unsigned char (0.36 сек.)
2. unsigned int (0.36 сек.)
3. unsigned long (0.36 сек.)
4. unsigned long long (0.36 сек.)
5. uint8_t (0.36 сек.)
6. uint32_t (0.36 сек.)
7. uint64_t (0.36 сек.)
8. float (0.36 сек.)
9. unsigned short (0.42 сек.)
10. uint16_t (0.42 сек.)
11. double (0.42 сек.)
12. long double (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. double (0.22 сек.)
9. float (0.23 сек.)
10. unsigned long long (0.24 сек.)
11. uint64_t (0.24 сек.)
12. long double (1.47 сек.)

Операция присваивания (c-style array)

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. float (0.22 сек.)
9. double (0.22 сек.)
10. unsigned long long (0.24 сек.)
11. uint64_t (0.24 сек.)
12. long double (1.47 сек.)

Операция вычитания (std::vector)

1. uint32_t (0.51 сек.)
2. unsigned int (0.52 сек.)
3. unsigned long (0.52 сек.)
4. unsigned char (0.55 сек.)
5. uint8_t (0.55 сек.)
6. uint16_t (0.55 сек.)
7. unsigned short (0.56 сек.)
8. unsigned long long (0.7 сек.)
9. uint64_t (0.7 сек.)
10. float (0.93 сек.)
11. double (0.93 сек.)
12. long double (2.18 сек.)

Операция вычитания (c-style array)

1. unsigned int (0.51 сек.)
2. unsigned long (0.51 сек.)
3. uint32_t (0.51 сек.)
4. unsigned char (0.55 сек.)
5. unsigned short (0.55 сек.)
6. uint8_t (0.55 сек.)
7. uint16_t (0.55 сек.)
8. unsigned long long (0.69 сек.)
9. uint64_t (0.69 сек.)
10. float (0.92 сек.)
11. double (0.93 сек.)
12. long double (2.17 сек.)

Операция деления (std::vector)

1. unsigned int (1.96 сек.)
2. unsigned long (1.96 сек.)
3. uint32_t (1.96 сек.)
4. unsigned char (2.14 сек.)
5. unsigned short (2.14 сек.)
6. uint8_t (2.14 сек.)
7. uint16_t (2.14 сек.)
8. unsigned long long (3.65 сек.)
9. uint64_t (3.65 сек.)
10. float (4.22 сек.)
11. double (4.22 сек.)
12. long double (5.27 сек.)

Операция деления (c-style array)

1. unsigned int (1.98 сек.)
2. unsigned long (1.98 сек.)
3. uint32_t (1.98 сек.)
4. unsigned char (2.16 сек.)
5. uint16_t (2.16 сек.)
6. unsigned short (2.17 сек.)
7. uint8_t (2.17 сек.)
8. unsigned long long (3.96 сек.)
9. uint64_t (3.96 сек.)
10. float (4.22 сек.)
11. double (4.23 сек.)
12. long double (5.29 сек.)

Добавление элементов в конец массива (std::vector)

1. unsigned char (0.01 сек.)
2. unsigned short (0.01 сек.)
3. uint8_t (0.01 сек.)
4. uint16_t (0.01 сек.)
5. unsigned int (0.02 сек.)
6. unsigned long (0.02 сек.)
7. uint32_t (0.02 сек.)
8. float (0.02 сек.)
9. unsigned long long (0.03 сек.)
10. uint64_t (0.03 сек.)
11. double (0.03 сек.)
12. long double (0.04 сек.)

Добавление элементов в конец массива (c-style array)

1. unsigned int (0.24 сек.)
2. unsigned long (0.24 сек.)
3. uint32_t (0.24 сек.)
4. double (0.24 сек.)
5. unsigned long long (0.26 сек.)
6. uint64_t (0.27 сек.)
7. unsigned short (0.31 сек.)
8. uint16_t (0.31 сек.)
9. float (0.31 сек.)
10. unsigned char (0.72 сек.)
11. uint8_t (0.72 сек.)
12. long double (0.73 сек.)

Intel Core i5-3230M



За упорядоченным по времени списком сюда
Скрытый текст
Операция присваивания (std::vector)

1. float (0.12 сек.)
2. double (0.12 сек.)
3. long double (0.12 сек.)
4. uint16_t (0.14 сек.)
5. unsigned short (0.15 сек.)
6. unsigned int (0.17 сек.)
7. unsigned long (0.17 сек.)
8. uint32_t (0.17 сек.)
9. unsigned char (0.23 сек.)
10. uint8_t (0.23 сек.)
11. unsigned long long (0.28 сек.)
12. uint64_t (0.28 сек.)

Операция присваивания (c-style array)

1. unsigned char (0.11 сек.)
2. unsigned short (0.11 сек.)
3. unsigned int (0.11 сек.)
4. unsigned long (0.11 сек.)
5. uint8_t (0.11 сек.)
6. uint32_t (0.11 сек.)
7. float (0.11 сек.)
8. double (0.11 сек.)
9. long double (0.11 сек.)
10. uint16_t (0.12 сек.)
11. unsigned long long (0.22 сек.)
12. uint64_t (0.22 сек.)

Операция вычитания (std::vector)

1. unsigned short (0.23 сек.)
2. unsigned int (0.23 сек.)
3. unsigned long (0.23 сек.)
4. uint16_t (0.23 сек.)
5. uint32_t (0.23 сек.)
6. unsigned char (0.27 сек.)
7. uint8_t (0.27 сек.)
8. float (0.33 сек.)
9. double (0.33 сек.)
10. long double (0.33 сек.)
11. uint64_t (0.41 сек.)
12. unsigned long long (0.42 сек.)

Операция вычитания (c-style array)

1. unsigned char (0.23 сек.)
2. unsigned short (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. float (0.33 сек.)
11. double (0.33 сек.)
12. long double (0.33 сек.)

Операция деления (std::vector)

1. float (0.77 сек.)
2. double (0.89 сек.)
3. long double (0.89 сек.)
4. unsigned char (1 сек.)
5. unsigned short (1 сек.)
6. uint8_t (1 сек.)
7. uint16_t (1 сек.)
8. unsigned int (1.14 сек.)
9. uint32_t (1.14 сек.)
10. unsigned long (1.15 сек.)
11. unsigned long long (3.2 сек.)
12. uint64_t (3.21 сек.)

Операция деления (c-style array)

1. unsigned char (0.23 сек.)
2. unsigned short (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. float (0.41 сек.)
11. double (0.41 сек.)
12. long double (0.41 сек.)

Добавление элементов в конец массива (std::vector)

1. unsigned char (0 сек.)
2. unsigned short (0 сек.)
3. uint8_t (0 сек.)
4. uint16_t (0 сек.)
5. unsigned int (0.01 сек.)
6. unsigned long (0.01 сек.)
7. unsigned long long (0.01 сек.)
8. uint32_t (0.01 сек.)
9. uint64_t (0.01 сек.)
10. float (0.01 сек.)
11. double (0.01 сек.)
12. long double (0.01 сек.)

Добавление элементов в конец массива (c-style array)

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. float (0.13 сек.)
10. double (0.13 сек.)
11. long double (0.13 сек.)
12. unsigned long (0.16 сек.)

Intel Pentium CPU B960



За упорядоченным по времени списком сюда
Скрытый текст
Операция присваивания (std::vector)

1. float (0.19 сек.)
2. double (0.19 сек.)
3. long double (0.19 сек.)
4. unsigned short (0.23 сек.)
5. uint16_t (0.23 сек.)
6. unsigned int (0.28 сек.)
7. unsigned long (0.28 сек.)
8. uint32_t (0.28 сек.)
9. unsigned char (0.4 сек.)
10. uint8_t (0.4 сек.)
11. unsigned long long (0.45 сек.)
12. uint64_t (0.45 сек.)

Операция присваивания (c-style array)

1. unsigned short (0.18 сек.)
2. unsigned long (0.18 сек.)
3. double (0.18 сек.)
4. unsigned char (0.19 сек.)
5. unsigned int (0.19 сек.)
6. uint8_t (0.19 сек.)
7. uint16_t (0.19 сек.)
8. uint32_t (0.19 сек.)
9. float (0.19 сек.)
10. long double (0.19 сек.)
11. unsigned long long (0.37 сек.)
12. uint64_t (0.37 сек.)

Операция вычитания (std::vector)

1. unsigned short (0.41 сек.)
2. unsigned long (0.41 сек.)
3. uint8_t (0.41 сек.)
4. uint32_t (0.41 сек.)
5. unsigned char (0.42 сек.)
6. unsigned int (0.42 сек.)
7. uint16_t (0.42 сек.)
8. uint64_t (0.53 сек.)
9. unsigned long long (0.54 сек.)
10. float (0.55 сек.)
11. double (0.55 сек.)
12. long double (0.55 сек.)

Операция вычитания (c-style array)

1. unsigned short (0.41 сек.)
2. uint16_t (0.41 сек.)
3. unsigned char (0.42 сек.)
4. unsigned 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. float (0.55 сек.)
11. double (0.55 сек.)
12. long double (0.55 сек.)

Операция деления (std::vector)

1. float (1.84 сек.)
2. double (1.84 сек.)
3. long double (1.84 сек.)
4. unsigned short (1.97 сек.)
5. uint16_t (1.97 сек.)
6. unsigned char (1.98 сек.)
7. unsigned int (1.98 сек.)
8. unsigned long (1.98 сек.)
9. uint8_t (1.98 сек.)
10. uint32_t (1.98 сек.)
11. unsigned long long (4.96 сек.)
12. uint64_t (4.96 сек.)

Операция деления (c-style array)

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. unsigned int (0.45 сек.)
7. unsigned long (0.45 сек.)
8. uint16_t (0.45 сек.)
9. uint32_t (0.45 сек.)
10. float (0.68 сек.)
11. double (0.68 сек.)
12. long double (0.68 сек.)

Добавление элементов в конец массива (std::vector)

1. unsigned char (0 сек.)
2. unsigned short (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. float (0.01 сек.)
9. unsigned long long (0.02 сек.)
10. uint64_t (0.02 сек.)
11. double (0.02 сек.)
12. long double (0.02 сек.)

Добавление элементов в конец массива (c-style array)

1. unsigned char (0.21 сек.)
2. unsigned short (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. double (0.21 сек.)
9. long double (0.21 сек.)
10. unsigned long long (0.22 сек.)
11. float (0.22 сек.)
12. unsigned long (0.23 сек.)

Intel Pentium CPU G850



За упорядоченным по времени списком сюда
Скрытый текст
Операция присваивания (std::vector)

1. unsigned short (0.14 сек.)
2. unsigned int (0.14 сек.)
3. unsigned long (0.14 сек.)
4. unsigned 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. float (0.14 сек.)
10. double (0.14 сек.)
11. unsigned char (0.15 сек.)
12. long double (0.81 сек.)

Операция присваивания (c-style array)

1. float (0.14 сек.)
2. double (0.14 сек.)
3. unsigned short (0.18 сек.)
4. unsigned 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. unsigned int (0.19 сек.)
10. uint8_t (0.19 сек.)
11. uint32_t (0.19 сек.)
12. long double (0.79 сек.)

Операция вычитания (std::vector)

1. unsigned char (0.31 сек.)
2. unsigned short (0.31 сек.)
3. unsigned int (0.31 сек.)
4. unsigned 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. float (0.42 сек.)
11. double (0.42 сек.)
12. long double (0.97 сек.)

Операция вычитания (c-style array)

1. unsigned char (0.33 сек.)
2. unsigned short (0.33 сек.)
3. unsigned int (0.33 сек.)
4. unsigned 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. float (0.42 сек.)
11. double (0.42 сек.)
12. long double (0.98 сек.)

Операция деления (std::vector)

1. float (1.4 сек.)
2. double (1.4 сек.)
3. long double (1.4 сек.)
4. unsigned int (1.49 сек.)
5. uint32_t (1.49 сек.)
6. unsigned short (1.5 сек.)
7. uint16_t (1.5 сек.)
8. unsigned char (1.51 сек.)
9. uint8_t (1.51 сек.)
10. unsigned long (3.33 сек.)
11. unsigned long long (3.33 сек.)
12. uint64_t (3.33 сек.)

Операция деления (c-style array)

1. float (1.4 сек.)
2. double (1.4 сек.)
3. long double (1.41 сек.)
4. unsigned int (1.49 сек.)
5. uint32_t (1.49 сек.)
6. unsigned char (1.51 сек.)
7. unsigned short (1.51 сек.)
8. uint8_t (1.51 сек.)
9. uint16_t (1.51 сек.)
10. unsigned long long (3.24 сек.)
11. uint64_t (3.24 сек.)
12. unsigned long (3.25 сек.)

Добавление элементов в конец массива (std::vector)

1. unsigned char (0 сек.)
2. unsigned short (0 сек.)
3. uint8_t (0 сек.)
4. uint16_t (0 сек.)
5. unsigned int (0.01 сек.)
6. unsigned long (0.01 сек.)
7. unsigned long long (0.01 сек.)
8. uint32_t (0.01 сек.)
9. uint64_t (0.01 сек.)
10. float (0.01 сек.)
11. double (0.01 сек.)
12. long double (0.02 сек.)

Добавление элементов в конец массива (c-style array)

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. double (0.15 сек.)
7. unsigned short (0.16 сек.)
8. unsigned int (0.16 сек.)
9. uint16_t (0.16 сек.)
10. uint32_t (0.16 сек.)
11. float (0.16 сек.)
12. long double (0.48 сек.)

Когда же использовать std::vector?

В больших массивах, где количество арифметических операций сводится к минимуму, и где обильно применяется операция добавления элементов. В противном случае предпочтительнее классические массивы.

Ну а числовые типы? Какой всё-таки быстрее, какой медленнее?

Здесь точного ответа нет. По результатам можно лишь сказать несколько слов про unsigned long long / uint64_t. Данные типы полезны тогда, когда необходимо хранить числа в диапазоне, превышающем 4 байта. В остальных же случаях лучше отказаться, поскольку падает производительность и очень заметно.
Tags:
Hubs:
-1
Comments7

Articles