Длинные списки параметров передачи по ссылке и типов обертки - PullRequest
3 голосов
/ 12 августа 2009

Мне нужно получить три объекта из функции, мой инстинкт - создать новый тип, чтобы вернуть три ссылки. Или, если ссылки были того же типа, я мог бы использовать массив. Однако передать по ссылке проще:


        private void Mutate_AddNode_GetGenes(ref NeuronGene newNeuronGene, ref ConnectionGene newConnectionGene1, ref ConnectionGene newConnectionGene2)
        {

        }

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

Есть ли более элегантный подход C # 2 в C # 3?

Спасибо.

Ответы [ 3 ]

3 голосов
/ 12 августа 2009

Почти для всех вычислительных проблем вы не заметите разницы в процессоре. Поскольку в вашем примере кода есть слово «Gene», вы можете попасть в редкую категорию кода, которая заметит.

Создание и уничтожение объектов просто для того, чтобы обернуть другие объекты, будет стоить немного производительности (их нужно создавать и собирать мусор в конце концов).

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

1 голос
/ 12 августа 2009

Беспокойство об относительной скорости выполнения этих двух вариантов, вероятно, является преждевременной оптимизацией. Сосредоточьтесь на том, чтобы сначала получить правильный алгоритм, и иметь чистый, поддерживаемый код. Когда это будет сделано, вы можете запустить профилировщик и оптимизировать 20% кода, который занимает 80% процессорного времени. Даже если этот метод окажется в этих 20%, разница между двумя стилями вызова, вероятно, слишком мала для регистрации.

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

1 голос
/ 12 августа 2009

Если вы беспокоитесь о производительности типа упаковки (который намного чище, IMHO), вам следует использовать struct. Текущие 32-битные реализации .NET (и готовящиеся к выпуску 64-битные 4.0) во многих случаях поддерживают встраивание / оптимизацию структур, поэтому вы, вероятно, не увидите никакой разницы в производительности между структурой и ref аргументами.

...