Боюсь, что в отсутствие контроля над вашей реализацией GC единственный ответ на такие вопросы, который даст вам полезные результаты, - «Прекратите создавать так много объектов».
Конкретным ответом на ваши конкретные потребности является использование продолжений.
Продолжения в моно имеют разновидность стека для копирования . (при условии, что вы используете встроенную реализацию Tasklets).
Похоже, что монокомпилятор / JIT хранит эти копии в управляемом коде, поэтому использование продолжений с низким отношением работы к выходу может привести к значительным издержкам GC. Таким образом, ваши проблемы с количеством времени GC настоятельно предполагают, что вы используете сопрограммы таким образом, что аспекты реализации перевешивают количество времени, которое вы тратите на фактической сопрограммы с некоторым запасом.
Если вы зависите от продолжений производительности, вы можете рассмотреть возможность перехода на непереносимую альтернативу (поскольку они не поддерживаются в Windows CLR, это не теряет много переносимости) в неуправляемом коде для этого аспекта ваша система.
Вы также можете перейти к основанной на перечислении модели, используя (полностью переносимые) конструкции yield return, которые будут вызывать создание объекта только при первом вызове, а не на всех выходах, которые могут быть чистым выигрышем. Очевидно, что код потребует переписывания, и это не будет работать так же хорошо, если вы используете вложенные конструкции.
Для ознакомления с этим обратитесь к разделу , озаглавленному «C # Yield Statement in Mono» , который используется в Unity.