Оптимизация функций над константами
От: Философ Ад http://vk.com/id10256428
Дата: 10.01.14 04:16
Оценка:
У меня определено несколько стоковых констант, например:

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() с одинаковыми параметрами всегда будет одинаковым (чистая функция)? Т.е. возможно ли заставить его это оптимизировать (хранить промежуточные значения)?
Всё сказанное выше — личное мнение, если не указано обратное.
Re: Оптимизация функций над константами
От: samius Япония http://sams-tricks.blogspot.com
Дата: 10.01.14 04:26
Оценка: 4 (1)
Здравствуйте, Философ, Вы писали:

Ф>1) Оптимизирует ли компилятор C# такие вызовы автоматически?

нет

Ф>2) Т.е. возможно ли заставить его это оптимизировать (хранить промежуточные значения)?

нет

Придется решать, либо наглядность, либо оптимизация под множественные вызовы.
Оптимальным по быстродействию решением, как мне кажется, будет создание множества спецфункций для каждого набора символов, причем на switch-ах.
Re[2]: Оптимизация функций над константами
От: Философ Ад http://vk.com/id10256428
Дата: 10.01.14 04:34
Оценка:
Здравствуйте, samius, Вы писали:

S>Оптимальным по быстродействию решением, как мне кажется, будет создание множества спецфункций для каждого набора символов, причем на switch-ах.


Это жестяная жесть будет — уж лучше пусть тормозит.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[3]: Оптимизация функций над константами
От: adontz Грузия http://adontz.wordpress.com/
Дата: 10.01.14 05:44
Оценка: +2
Здравствуйте, Философ, Вы писали:

Ф>Это жестяная жесть будет — уж лучше пусть тормозит.


Можно попробовать внутри функции сделать кеш IDictionary<Tuple<p_String,p_Chars>, result>
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Оптимизация функций над константами
От: Artem Korneev США https://www.linkedin.com/in/artemkorneev/
Дата: 10.01.14 09:22
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>
Ф>SpecialChars = "<>:\"/\\|?*";
Ф>


Ф>Это сделано просто для удобства, т.е. чтобы можно было написать, например, вот так:


Ф>
Ф>if (p_Char.In( SpecialChars.Without( '\\' ) )) {}
Ф>


Определите несколько полей в классе и инициализируйте их в конструкторе нужными комбинациями, полученными из исходного набора.
Получите и оптимизацию и повышение читабельности. Ведь это вот ваше SpecialChars.Without('\\'), вероятно, может иметь какое-то имя, поясняющее, почему вы удалили слэш оттуда.
С уважением, Artem Korneev.
Re: Оптимизация функций над константами
От: hardcase Пират http://nemerle.org
Дата: 10.01.14 10:24
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>Это сделано просто для удобства, т.е. чтобы можно было написать, например, вот так:


Ф>
Ф>if (p_Char.In( SpecialChars.Without( '\\' ) )) {}
Ф>


Что мешает писать например так:
if(p_Char != '\\' && p_Char.In(SpecialChars))
/* иЗвиНите зА неРовнЫй поЧерК */
Re: Оптимизация функций над константами
От: Danchik Украина  
Дата: 10.01.14 15:13
Оценка:
Здравствуйте, Философ, Вы писали:

[Skip]

Не вижу смысла в этих функциях. У вас есть Linq и все его плюшки
SpecialChars.Where(c => c != '\\').Contains(p_Char);
// или
SpecialChars.Except("\\").Contains(p_Char);


Да скорость тут не на высоте, тогда Without нужно кешировать и не забывать об синхронизации.
Re[2]: Оптимизация функций над константами
От: Философ Ад http://vk.com/id10256428
Дата: 10.01.14 16:40
Оценка:
Здравствуйте, 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 нужно кешировать и не забывать об синхронизации.

Изначальный вопрос заключался как раз в возможности автоматической, или полуавтоматической оптимизации такого кода.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[2]: Оптимизация функций над константами
От: Философ Ад http://vk.com/id10256428
Дата: 10.01.14 16:41
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Что мешает писать например так:

H>
if(p_Char != '\\' && p_Char.In(SpecialChars))


http://rsdn.ru/forum/dotnet/5424658.1
Автор: Философ
Дата: 10.01.14
Всё сказанное выше — личное мнение, если не указано обратное.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.