Почему бы не попробовать 100 000 раз и посмотреть, сколько времени это займет в каждом конкретном случае?
Потому что это не проверяет реалистичный сценарий использования атрибута.Это дорого первый раз, когда вы выкапываете атрибут, дешево после этого.Расходы заключаются в загрузке IL для класса атрибута и его компиляции, нахождении данных атрибута в метаданных сборки и загрузке их с диска.Затем вызывая конструктор атрибута и назначая свойства атрибута.Стоимость вашего кода для чтения атрибута по сравнению с ним арахисовая, это дисковый ввод-вывод, который стоит на несколько порядков дороже.Во второй раз, когда вы извлекаете атрибут, большая часть этой работы выполняется, и это будет быстро, только инициализация объекта из данных, которые кэшируются.
Обычно атрибут считывается только один раз, может быть, несколько раз.Таким образом, в первую очередь стоит дорого, код, который вы используете, имеет очень мало значения.Идите вперед и профилируйте это.Просто убедитесь, что вы не рассматриваете этот дорогой первый раз как «экспериментальную ошибку».