как зафиксировать емкость памяти для моего приложения в C?

Если вам удастся обновить приложение до C # 6, вам повезет. В новой версии C # реализованы фильтры исключений. Таким образом, вы можете написать это:

catch (Exception ex) when (ex is FormatException || ex is OverflowException) {
    WebId = Guid.Empty;
}

Некоторые люди думают, что этот код такой же, как

catch (Exception ex) {                
    if (ex is FormatException || ex is OverflowException) {
        WebId = Guid.Empty;
    }
    throw;
}

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

См. обсуждение этого на CodePlex . И пример , показывающий разницу .

5
задан 19 June 2009 в 06:24
поделиться

5 ответов

Под unix: "ulimit -d 64M"

4
ответ дан 13 December 2019 в 19:33
поделиться

Если вы работаете в системе, основанной на POSIX, System V или BSD, вы можете использовать setrlimit () с ресурсом RLIMIT_DATA - аналогично ulimit -d .

Также взгляните на ресурс RLIMIT_CPU - вероятно, это то, что вам нужно (аналогично ulimit -t )

Подробнее см. man setrlimit .

3
ответ дан 13 December 2019 в 19:33
поделиться

Один довольно простой способ, который я мог бы гарантировать, чтобы не пересечь максимальный порог памяти в вашем приложении, - это определить вашу собственную специальную функцию malloc () , которая ведет счет сколько памяти было выделено, и возвращает указатель NULL, если порог был превышен. Это, конечно, будет зависеть от того, что вы будете проверять возвращаемое значение malloc () каждый раз, когда вы его вызываете, что в любом случае считается хорошей практикой, потому что нет гарантии, что malloc () найдет непрерывный блок памяти запрошенного вами размера.

Это не будет надежным, потому что, вероятно, не будет учитывать заполнение памяти для выравнивания слов, поэтому вы, вероятно, достигнете предела памяти в 64 МБ задолго до того, как ваша функция сообщит, что вы его достигли.

Кроме того, если вы используете Win32, вероятно, есть API который вы можете использовать для получения текущего размера процесса и проверки его в вашей пользовательской функции malloc () . Имейте в виду, что добавление этих накладных расходов на проверку к вашему коду, скорее всего, приведет к тому, что он будет использовать больше ЦП и работать намного медленнее, чем обычно, что хорошо ведет к вашему следующему вопросу:)

И также мне следует избегать использования большего количества потому что он, вероятно, не будет учитывать заполнение памяти для выравнивания слов, поэтому вы, вероятно, достигнете предела памяти в 64 МБ задолго до того, как ваша функция сообщит, что вы его достигли.

Кроме того, если вы используете Win32, там вероятно, API, которые вы могли бы использовать для получения текущего размера процесса и проверки его в вашей пользовательской функции malloc () . Имейте в виду, что добавление этих накладных расходов на проверку к вашему коду, скорее всего, приведет к тому, что он будет использовать больше ЦП и работать намного медленнее, чем обычно, что хорошо ведет к вашему следующему вопросу:)

И также мне следует избегать использования большего количества потому что он, вероятно, не будет учитывать заполнение памяти для выравнивания слов, поэтому вы, вероятно, достигнете предела памяти в 64 МБ задолго до того, как ваша функция сообщит, что вы его достигли.

Кроме того, если вы используете Win32, там вероятно, API, которые вы могли бы использовать для получения текущего размера процесса и проверки его в вашей пользовательской функции malloc () . Имейте в виду, что добавление этих накладных расходов на проверку к вашему коду, скорее всего, приведет к тому, что он будет использовать больше ЦП и работать намного медленнее, чем обычно, что хорошо ведет к вашему следующему вопросу:)

И также мне следует избегать использования большего количества вероятно, есть API, которые вы могли бы использовать для получения текущего размера процесса и проверки его в вашей пользовательской функции malloc () . Имейте в виду, что добавление этих накладных расходов на проверку к вашему коду, скорее всего, приведет к тому, что он будет использовать больше ЦП и работать намного медленнее, чем обычно, что хорошо ведет к вашему следующему вопросу:)

И также мне следует избегать использования большего количества вероятно, есть API, которые вы могли бы использовать для получения текущего размера процесса и проверки его в вашей пользовательской функции malloc () . Имейте в виду, что добавление этих накладных расходов на проверку к вашему коду, скорее всего, приведет к тому, что он будет использовать больше ЦП и работать намного медленнее, чем обычно, что хорошо ведет к вашему следующему вопросу:)

И также мне следует избегать использования большего количества Использование процессора.

Это очень общий вопрос, и на него нет простого ответа. Вы можете написать две разные программы, которые, по сути, делают одно и то же, и одна из них может быть в 100 раз более интенсивной, чем другая, из-за используемых алгоритмов. Лучший способ:

  1. Установить несколько тестов производительности.
  2. Напишите свою программу.
  3. Измерьте, соответствует ли она вашим тестам.
  4. Если она не соответствует вашим тестам, оптимизируйте и переходите к шагу (3).

Вы можете использовать программы профилирования, чтобы помочь вам определить, где ваши алгоритмы необходимо оптимизировать. Rational Quantify является примером коммерческого, но есть и много бесплатных профилировщиков.

3
ответ дан 13 December 2019 в 19:33
поделиться

Хм; хороший вопрос. Я вижу, как вы могли бы сделать это для памяти, выделенной из кучи, используя специальную версию malloc и free, но я также не знаю, как применить ее в стеке.

Управлять процессором еще сложнее ...

Интересно.

0
ответ дан 13 December 2019 в 19:33
поделиться

Для ЦП у нас была задача с очень низким приоритетом (ниже, чем у всего остального), которая ничего не делает, кроме подсчета. Затем вы можете увидеть, как часто эта задача запускается, и узнать, не слишком ли много ресурсов потребляют остальные процессы. Этот подход не работает, если вы хотите ограничить свой процесс 10% во время работы других процессов, но если вы хотите убедиться, что у вас свободно на 50% ЦП, тогда он отлично работает.

Из-за ограничений памяти вы либо застряли реализовать собственный уровень поверх malloc или каким-либо образом использовать преимущества вашей ОС. В системах Unix ulimit - ваш друг. Бьюсь об заклад, на VxWorks вы, вероятно, могли бы найти способ воспользоваться блоком управления задачами, чтобы узнать, сколько памяти использует приложение ... если для этого еще нет функции. В Windows вы, вероятно, могли бы хотя бы настроить монитор, чтобы сообщать, действительно ли ваше приложение превышает 64 МБ.

Другой вопрос: что вы делаете в ответ? Должно ли ваше приложение вылетать, если оно превышает 64 МБ? Вы хотите, чтобы это руководство помогло вам ограничить себя? В этом может быть разница между выбором «принудительного» подхода и «мониторинга и отчетности».

1
ответ дан 13 December 2019 в 19:33
поделиться
Другие вопросы по тегам:

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