KAN`ский блог Мысли вслух…
  • Окт
    6

    Сравнение vector и простой массив int[]

    Filed under: Без рубрики;

    Закралось, тут у меня сомнения относительно производительности операций создания и заполнения векторов, решил провестий простой тест, код ниже. Результаты несколько меня удивили:
    В Debug-mode:

    The above code block-1 was executed in 0.0500 second(s)
    The above code block-2 was executed in 44.5400 second(s)

    В Realese-mode:

    The above code block-1 was executed in 0.0440 second(s)
    The above code block-2 was executed in 0.1030 second(s)

    Каждый тест запускался по 10 раз, отображены средние результаты.

    #include <windows.h>
    #include <time.h>
    #include <iostream>
    #include <vector>
     
    HANDLE gHeap;
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	gHeap = HeapCreate(0,6553,65530);
    	int test[1000]={0};
     
    	clock_t start = clock();
    	for (int i=0;i<100000;i++){
    		int* var1 = (int*)HeapAlloc(gHeap,0,1000);
    		memcpy(var1, &test[0], 1000);
     
    		int* var2 = (int*)HeapAlloc(gHeap,0,900);
    		memcpy(var2, &var1[99], 900);
    		HeapFree(gHeap,0,var1);
     
    		memcpy(&test[99], var2, 900);
    		HeapFree(gHeap,0,var2);
    	}
    	clock_t stop = clock();
    	printf("The above code block-1 was executed in %.4f second(s)n", ((double) stop - start) / ((double) CLOCKS_PER_SEC));
     
     
    	start = clock();
    	for (int i=0;i<100000;i++){
    		std::vector<int> var3(1000);
    		memcpy(&var3[0], &test[0], 1000);
     
    		std::vector<int> var4(var3);
    		memcpy(&test[99], &var4[99], 900);
    	}
    	stop = clock();
    	printf("The above code block-2 was executed in %.4f second(s)n", ((double) stop - start) / ((double) CLOCKS_PER_SEC));
     
    	HeapDestroy(gHeap);
     
    	//getchar();
    	return 0;
    }
    
    
    

    Стандартная библиотека языка C++ предоставляет контейнер std::vector, который является динамическим массивом и обладает рядом преимуществ по сравнению с обычным массивом C.

    1. Гибкость размера: Вектор std::vector может изменять свой размер динамически, а это означает, что он может быть увеличен или уменьшен по мере необходимости, что делает его более гибким в управлении памятью. В то время как обычный массив C имеет фиксированный размер и его необходимо изменять вручную, выделяя или освобождая память.
    2. Удобство использования: Вектор предоставляет различные методы и функции для работы с элементами, такие как push_back, pop_back, insert, erase и другие. Это делает его более удобным для добавления, удаления и изменения элементов массива, в то время как для обычного массива C требуется больше усилий для выполнения этих операций.
    3. Безопасность: Вектор std::vector автоматически управляет памятью, что уменьшает вероятность ошибок при работе с памятью, таких как переполнение буфера или утечка памяти. В обычном массиве C отсутствует автоматическое управление памятью, и ошибки в управлении памятью могут привести к серьезным проблемам безопасности.
    4. Итераторы и алгоритмы: Вектор поддерживает использование итераторов и стандартных алгоритмов STL, что делает его удобным для применения различных операций и алгоритмов над элементами. Это улучшает читаемость и поддерживаемость кода.
    5. Производительность: Вектор std::vector обеспечивает производительность, сравнимую с обычным массивом C в большинстве случаев, а иногда даже лучше благодаря внутренней оптимизации и использованию эффективных алгоритмов.

    Однако стоит отметить, что есть ситуации, когда использование обычного массива C может быть предпочтительным из-за своей простоты и предсказуемости поведения. В целом, выбор между вектором std::vector и обычным массивом C зависит от конкретных требований проекта и удобства использования.

     
    Комментарии к записи Сравнение vector и простой массив int[] отключены

Comments are closed.