Мне кажется, им легко пользоваться. 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"]));
Используйте #pragma optimize ("", выкл.)
в верхней части выбранных файлов, которые вы хотите отладить в выпуске. Это дает лучшее представление трассировки стека / переменных.
Хорошо работает, если вам нужно всего несколько файлов для устранения ошибки.
Почему бы вам просто не включить отладочную информацию в конфигурации выпуска?
Мы отключили отладку Iterator с помощью символы препроцессора:
_HAS_ITERATOR_DEBUGGING=0
_SCL_SECURE=0
Это немного помогло, но все же оказалось не так быстро, как хотелось бы. Мы также закончили тем, что сделали нашу отладочную сборку более похожей на выпуск, определив NDEBUG вместо _DEBUG. Мы изменили еще несколько вариантов, но я их не помню.
К сожалению, нам нужно было делать все это, но в нашем приложении есть определенный объем работы, который необходимо выполнять каждые 50 мсек или его невозможно использовать. VS2008 из коробки даст нам время ~ 60 мс для отладки и ~ 6 мс для выпуска. С помощью упомянутых выше настроек мы можем сократить время отладки до ~ 20 мс или около того, что, по крайней мере, можно использовать.
профилируйте приложение и посмотрите, на что нужно потратить время. после этого вы сможете увидеть, какую отладку необходимо настроить.
есть несколько различий между сборками отладки и сборками выпуска, которые влияют как на отлаживаемость, так и на скорость. Наиболее важными являются определение _DEBUG / NDEBUG, оптимизация компилятора и создание отладочной информации.
Возможно, вы захотите создать третью конфигурацию решения и поэкспериментировать с этими настройками. Например, добавление отладочной информации в сборку релиза на самом деле не снижает производительность, но вы уже получаете разумную трассировку стека, чтобы знать, в какой функции вы находитесь. Только информация о строке ненадежна из-за оптимизации компилятора.
Если если вам нужна надежная информация о строке, включите и выключите оптимизацию. Это немного замедлит выполнение, но все равно будет быстрее, чем обычная отладка, пока не задано определение _DEBUG.
Используете ли вы MFC?
По моему опыту, главное, что может замедлить отладочную версию, - это процедуры проверки класса, которые в выпуске обычно отключены. Если структура данных вообще древовидная, это может привести к повторной проверке поддеревьев сотни раз.
В любом случае, если она, скажем, в 10 раз медленнее, чем сборка релиза, это означает, что она тратит 1/10 своего времени делает то, что необходимо, и 9/10 делает что-то еще. Если, ожидая этого, вы просто нажмете кнопку «пауза» и посмотрите на стек вызовов, есть вероятность 9/10, что вы точно увидите, в чем проблема.
Это быстро и грязно, но эффективный способ поиска проблем с производительностью.
Какую VS вы используете? Недавно мы перешли с VS.net на VS2008, и я испытал такую же медлительность при отладке на высокопроизводительной машине в проекте> 500k LOC. Оказывается, база Intellisense была повреждена и постоянно обновлялась, но где-то застревала. Удаление файла .ncb устранило проблему.
Создайте ReleaseWithSymbols , которая определяет NDEBUG и не включает оптимизацию. Это даст вам лучшую производительность при сохранении точных символов для отладки.