У меня определено несколько стоковых констант, например:
SpecialChars = "<>:\"/\\|?*";
и есть набор статических методов вот такого вида:
public static bool In(this Char p_Char, string p_String);
public static char[] Without(this string p_String, params char[] p_Chars);
Это сделано просто для удобства, т.е. чтобы можно было написать, например, вот так:
if (p_Char.In( SpecialChars.Without( '\\' ) )) {}
Вышеприведённый код вызывается код огромное кол-во раз.
Возникло два вопроса:
1) Оптимизирует ли компилятор C# такие вызовы автоматически?
Сильно подозреваю, что нет — не оптимизирует.
Однако перегружать код предвычислениями или "промежуточными" константами не хочется — он от этого сложнее станет.
Поэтому возник второй вопрос:
2) Можно ли как-нибудь подсказать компилятору, что результат вызова функции Without() с одинаковыми параметрами всегда будет одинаковым (чистая функция)? Т.е. возможно ли заставить его это оптимизировать (хранить промежуточные значения)?
Всё сказанное выше — личное мнение, если не указано обратное.
Здравствуйте, Философ, Вы писали:
Ф>1) Оптимизирует ли компилятор C# такие вызовы автоматически?
нет
Ф>2) Т.е. возможно ли заставить его это оптимизировать (хранить промежуточные значения)?
нет
Придется решать, либо наглядность, либо оптимизация под множественные вызовы.
Оптимальным по быстродействию решением, как мне кажется, будет создание множества спецфункций для каждого набора символов, причем на switch-ах.
Здравствуйте, samius, Вы писали:
S>Оптимальным по быстродействию решением, как мне кажется, будет создание множества спецфункций для каждого набора символов, причем на switch-ах.
Это жестяная жесть будет — уж лучше пусть тормозит.
Всё сказанное выше — личное мнение, если не указано обратное.
Определите несколько полей в классе и инициализируйте их в конструкторе нужными комбинациями, полученными из исходного набора.
Получите и оптимизацию и повышение читабельности. Ведь это вот ваше SpecialChars.Without('\\'), вероятно, может иметь какое-то имя, поясняющее, почему вы удалили слэш оттуда.
Здравствуйте, Danchik, Вы писали:
D>Не вижу смысла в этих функциях. У вас есть Linq и все его плюшки D>
D>SpecialChars.Where(c => c != '\\').Contains(p_Char);
D>// или
D>SpecialChars.Except("\\").Contains(p_Char);
D>
Они нужны ради моего эстетического удовольствия.
Во-первых, мне нравится мне вот так:
SpecialChars.Without( '\\' )
писать, а во-вторых я ещё не видел ни одного человека, которому бы такой код показался сложным или непонятным.
Например, код вот такого вида:
if(p_Char != '\\' && p_Char.In(SpecialChars))
намного сложнее. Только из-за наличия конъюнкции.
Вот такое D>
D>SpecialChars.Where(c => c != '\\').Contains(p_Char);
D>
тем более сложнее. Нифигасебе, на пустом месте лямбду налепил!
D>Да скорость тут не на высоте, тогда Without нужно кешировать и не забывать об синхронизации.
Изначальный вопрос заключался как раз в возможности автоматической, или полуавтоматической оптимизации такого кода.
Всё сказанное выше — личное мнение, если не указано обратное.