Сколько уровни оптимизации GCC там?

Для C++ карта работает хорошо. Несколько миллионов объектов не будут проблемой. 10 миллионов объектов заняли приблизительно 4,4 секунды и приблизительно 57 meg на моем компьютере.

Мое тестовое приложение следующие:

#include <stdio.h>
#include <stdlib.h>
#include <map>

class triple {
public:
    int x;
    int y;
    int z;
    bool operator<(const triple &other) const {
        if (x < other.x) return true;
        if (other.x < x) return false;
        if (y < other.y) return true;
        if (other.y < y) return false;
        return z < other.z;
    }
};

int main(int, char**)
{
    std::map<triple,int> data;
    triple point;
    int i;

    for (i = 0; i < 10000000; ++i) {
        point.x = rand();
        point.y = rand();
        point.z = rand();
        //printf("%d %d %d %d\n", i, point.x, point.y, point.z);
        data[point] = i;
    }
    return 0;
}

Теперь для динамичного выбора количества переменных самое легкое решение состоит в том, чтобы представить индекс как строка , и затем использовать строку в качестве ключа для карты. Например, объект, расположенный в [23] [55], может быть представлен через "23,55" строка. Мы можем также расширить это решение для более высоких размеров; такой что касается трех измерений произвольный индекс будет похож "34,45,56". Простая реализация этой техники следующие:

std::map data<string,int> data;
char ix[100];

sprintf(ix, "%d,%d", x, y); // 2 vars
data[ix] = i;

sprintf(ix, "%d,%d,%d", x, y, z); // 3 vars
data[ix] = i;
91
задан Peter Mortensen 22 November 2009 в 14:02
поделиться

2 ответа

Чтобы быть педантичным, есть 8 различных допустимых опций -O, которые вы можете передать gcc, хотя некоторые из них означают то же самое.

В исходной версии этого ответа указывалось, что существует 7 вариантов. GCC с тех пор добавил -Og , чтобы довести общее количество до 8

Из справочной страницы :

  • -O (То же, что -O1 )
  • -O0 (без оптимизации, по умолчанию, если не указан уровень оптимизации)
  • -O1 (оптимизировать минимально)
  • -O2 (оптимизировать больше)
  • -O3 (оптимизируйте еще больше)
  • -Ofast (оптимизируйте очень агрессивно, вплоть до нарушения соответствия стандартам)
  • -Og (Оптимизируйте процесс отладки. -Og включает оптимизацию, которая не мешает отладка. Это должно быть уровень оптимизации для стандартного цикла редактирования-компиляции-отладки, предлагающий разумный уровень оптимизации при сохранении быстрой компиляции и хорошего опыта отладки.)
  • -Os (Оптимизация по размеру. -Os включает все оптимизации -O2 , которые обычно не увеличивают размер кода . Он также выполняет дальнейшую оптимизацию разработан для уменьшения размера кода. -Os отключает следующие флаги оптимизации: -falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks -freorder-blocks-and-partition -fprefetch-loop- array -ftree-vect-loop-version )

Также могут быть оптимизации для конкретных платформ, как отмечает @pauldoo, OS X имеет -Oz

126
ответ дан 24 November 2019 в 06:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: