Как заставить MSVC отладить сборки, выполненные быстрее

Мне кажется, им легко пользоваться. https://stackoverflow.com/a/32245370/4365315

var A = {a:11, b:22}, 
enumA = new TypeHelper(A);

if(enumA.Value === A.b || enumA.Key === "a"){ 
... 
}

var keys = enumA.getAsList();//[object, object]

//set
enumA.setType(22, false);//setType(val, isKey)

enumA.setType("a", true);

enumA.setTypeByIndex(1);

ОБНОВЛЕНИЕ:

Есть мои вспомогательные коды (TypeHelper).

var Helper = {
    isEmpty: function (obj) {
        return !obj || obj === null || obj === undefined || Array.isArray(obj) && obj.length === 0;
    },

    isObject: function (obj) {
        return (typeof obj === 'object');
    },

    sortObjectKeys: function (object) {
        return Object.keys(object)
            .sort(function (a, b) {
                c = a - b;
                return c
            });
    },
    containsItem: function (arr, item) {
        if (arr && Array.isArray(arr)) {
            return arr.indexOf(item) > -1;
        } else {
            return arr === item;
        }
    },

    pushArray: function (arr1, arr2) {
        if (arr1 && arr2 && Array.isArray(arr1)) {
            arr1.push.apply(arr1, Array.isArray(arr2) ? arr2 : [arr2]);
        }
    }
};
function TypeHelper() {
    var _types = arguments[0],
        _defTypeIndex = 0,
        _currentType,
        _value,
        _allKeys = Helper.sortObjectKeys(_types);

    if (arguments.length == 2) {
        _defTypeIndex = arguments[1];
    }

    Object.defineProperties(this, {
        Key: {
            get: function () {
                return _currentType;
            },
            set: function (val) {
                _currentType.setType(val, true);
            },
            enumerable: true
        },
        Value: {
            get: function () {
                return _types[_currentType];
            },
            set: function (val) {
                _value.setType(val, false);
            },
            enumerable: true
        }
    });
    this.getAsList = function (keys) {
        var list = [];
        _allKeys.forEach(function (key, idx, array) {
            if (key && _types[key]) {

                if (!Helper.isEmpty(keys) && Helper.containsItem(keys, key) || Helper.isEmpty(keys)) {
                    var json = {};
                    json.Key = key;
                    json.Value = _types[key];
                    Helper.pushArray(list, json);
                }
            }
        });
        return list;
    };

    this.setType = function (value, isKey) {
        if (!Helper.isEmpty(value)) {
            Object.keys(_types).forEach(function (key, idx, array) {
                if (Helper.isObject(value)) {
                    if (value && value.Key == key) {
                        _currentType = key;
                    }
                } else if (isKey) {
                    if (value && value.toString() == key.toString()) {
                        _currentType = key;
                    }
                } else if (value && value.toString() == _types[key]) {
                    _currentType = key;
                }
            });
        } else {
            this.setDefaultType();
        }
        return isKey ? _types[_currentType] : _currentType;
    };

    this.setTypeByIndex = function (index) {
        for (var i = 0; i < _allKeys.length; i++) {
            if (index === i) {
                _currentType = _allKeys[index];
                break;
            }
        }
    };

    this.setDefaultType = function () {
        this.setTypeByIndex(_defTypeIndex);
    };

    this.setDefaultType();
}

var TypeA = {
    "-1": "Any",
    "2": "2L",
    "100": "100L",
    "200": "200L",
    "1000": "1000L"
};

var enumA = new TypeHelper(TypeA, 4);

document.writeln("Key = ", enumA.Key,", Value = ", enumA.Value, "
"); enumA.setType("200L", false); document.writeln("Key = ", enumA.Key,", Value = ", enumA.Value, "
"); enumA.setDefaultType(); document.writeln("Key = ", enumA.Key,", Value = ", enumA.Value, "
"); enumA.setTypeByIndex(1); document.writeln("Key = ", enumA.Key,", Value = ", enumA.Value, "
"); document.writeln("is equals = ", (enumA.Value == TypeA["2"]));

10
задан pauldoo 24 June 2009 в 10:55
поделиться

8 ответов

Используйте #pragma optimize ("", выкл.) в верхней части выбранных файлов, которые вы хотите отладить в выпуске. Это дает лучшее представление трассировки стека / переменных.

Хорошо работает, если вам нужно всего несколько файлов для устранения ошибки.

12
ответ дан 3 December 2019 в 15:52
поделиться

Почему бы вам просто не включить отладочную информацию в конфигурации выпуска?

4
ответ дан 3 December 2019 в 15:52
поделиться

Мы отключили отладку Iterator с помощью символы препроцессора:

_HAS_ITERATOR_DEBUGGING=0
_SCL_SECURE=0

Это немного помогло, но все же оказалось не так быстро, как хотелось бы. Мы также закончили тем, что сделали нашу отладочную сборку более похожей на выпуск, определив NDEBUG вместо _DEBUG. Мы изменили еще несколько вариантов, но я их не помню.

К сожалению, нам нужно было делать все это, но в нашем приложении есть определенный объем работы, который необходимо выполнять каждые 50 мсек или его невозможно использовать. VS2008 из коробки даст нам время ~ 60 мс для отладки и ~ 6 мс для выпуска. С помощью упомянутых выше настроек мы можем сократить время отладки до ~ 20 мс или около того, что, по крайней мере, можно использовать.

4
ответ дан 3 December 2019 в 15:52
поделиться

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

3
ответ дан 3 December 2019 в 15:52
поделиться

есть несколько различий между сборками отладки и сборками выпуска, которые влияют как на отлаживаемость, так и на скорость. Наиболее важными являются определение _DEBUG / NDEBUG, оптимизация компилятора и создание отладочной информации.

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

Если если вам нужна надежная информация о строке, включите и выключите оптимизацию. Это немного замедлит выполнение, но все равно будет быстрее, чем обычная отладка, пока не задано определение _DEBUG.

1
ответ дан 3 December 2019 в 15:52
поделиться

Используете ли вы MFC?

По моему опыту, главное, что может замедлить отладочную версию, - это процедуры проверки класса, которые в выпуске обычно отключены. Если структура данных вообще древовидная, это может привести к повторной проверке поддеревьев сотни раз.

В любом случае, если она, скажем, в 10 раз медленнее, чем сборка релиза, это означает, что она тратит 1/10 своего времени делает то, что необходимо, и 9/10 делает что-то еще. Если, ожидая этого, вы просто нажмете кнопку «пауза» и посмотрите на стек вызовов, есть вероятность 9/10, что вы точно увидите, в чем проблема.

Это быстро и грязно, но эффективный способ поиска проблем с производительностью.

1
ответ дан 3 December 2019 в 15:52
поделиться

Какую VS вы используете? Недавно мы перешли с VS.net на VS2008, и я испытал такую ​​же медлительность при отладке на высокопроизводительной машине в проекте> 500k LOC. Оказывается, база Intellisense была повреждена и постоянно обновлялась, но где-то застревала. Удаление файла .ncb устранило проблему.

0
ответ дан 3 December 2019 в 15:52
поделиться

Создайте ReleaseWithSymbols , которая определяет NDEBUG и не включает оптимизацию. Это даст вам лучшую производительность при сохранении точных символов для отладки.

2
ответ дан 3 December 2019 в 15:52
поделиться
Другие вопросы по тегам:

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