Переделать код

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Нашел интересную задачку для знатоков С#. Есть код:
Код:
string textbefore = "[Login]=";
int k = project.Variables["Login_seosprint"].Value.IndexOf(textbefore, StringComparison.InvariantCultureIgnoreCase);
return (k != -1) ? project.Variables["Login_seosprint"].Value.Substring(k + textbefore.Length) : null;
Как можно строчку 2 и строчку 3 записать в одну, чтобы при этом не делать 1 лишнее действие (в моем сначала ищется текст и если его нету, то записывается в переменную -1, иначе номер вхождения и потом только идет проверка if), а я хочу чтобы сразу проверяло без записи в переменную. Знаю, что так можно в LINQ, но на данный момент для меня он сложен (знаю только 1-2 примера использования).
P.S. при этом не использовать 2 раза IndexOf и вообще не использовать регулярки
 
Последнее редактирование:

ZennoScript

Moderator
Регистрация
04.03.2011
Сообщения
4 451
Благодарностей
1 885
Баллы
113
Нашел интересную задачку для знатоков С#. Есть код:
Код:
string textbefore = "[Login]=";
int k = project.Variables["Login_seosprint"].Value.IndexOf(textbefore, StringComparison.InvariantCultureIgnoreCase);
return (k != -1) ? project.Variables["Login_seosprint"].Value.Substring(k + textbefore.Length) : null;
Как можно строчку 2 и строчку 3 записать в одну, чтобы при этом не делать 1 лишнее действие (в моем сначала ищется текст и если его нету, то записывается в переменную -1, иначе номер вхождения и потом только идет проверка if), а я хочу чтобы сразу проверяло без записи в переменную. Знаю, что так можно в LINQ, но на данный момент для меня он сложен (знаю только 1-2 примера использования).
P.S. при этом не использовать 2 раза IndexOf и вообще не использовать регулярки
Код:
string textbefore = "[Login]=";
return (project.Variables["Login_seosprint"].Value.IndexOf(textbefore, StringComparison.InvariantCultureIgnoreCase) != -1) ? project.Variables["Login_seosprint"].Value.Substring(k + textbefore.Length) : null;
Так что ле? А какой смысл убирать одну строчку? Что бы потом было сложнее прочитать?
Или я что то не так понял суть вопроса?
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Код:
string textbefore = "[Login]=";
return (project.Variables["Login_seosprint"].Value.IndexOf(textbefore, StringComparison.InvariantCultureIgnoreCase) != -1) ? project.Variables["Login_seosprint"].Value.Substring(k + textbefore.Length) : null;
Так что ле? А какой смысл убирать одну строчку? Что бы потом было сложнее прочитать?
Или я что то не так понял суть вопроса?
ты в своем коде переменную int k просто съел, а в другой строчке она появляется
P.S. смысл в том, что бывают задачки, в которых ты проверяешь наличие определенного текста (ну или переменной) с помощью indexof и если этот текст присутствует, то ты найденный текст сразу же присваиваешь той же переменной, но когда ты делаешь миллиарды операций, то постоянная запись в промежуточную переменную int заметно скажется в производительности. Аналогично и с регуляркой: сразу проверить наличие значения и если оно есть, то в тот же момент записать в нужную переменную без создания промежуточных, а если нету, то оставить прежней.
В то же время 2 раза использовать indexof ещё более затратно. Я конечно могу для повышения производительности создать эту переменную 1 раз и перезаписывать, но это тоже ресурсозатратно. Также тут можно ещё Ordinal прикрутить для IndexOf для быстрой обработки, но не в этом суть вопроса.
 
Последнее редактирование:

AShaggy

Активный пользователь
Регистрация
25.11.2014
Сообщения
335
Благодарностей
143
Баллы
43
Немного с простым Linq
C#:
string textbefore = "[Login]=";
return project.Variables["Login_seosprint"].Value.Split(new[] { textbefore }, StringSplitOptions.None).LastOrDefault();
только проблема будет когда там нет [Login]= он вернет всю строку
тогда надо смотреть на количество строк после Split их должно быть больше 1
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Посмотрел код несколько раз, но если честно, так и не понял, зачем такие заморочки.
У тебя в этой переменной project.Variables["Login_seosprint"] я так понял находится логин.
Но не просто логин, а еще с приставкой [Login]=

Возникает два вопроса.
1. Зачем ложить в переменную не чистый логин, а еще с какой то приставкой, чтобы потом заморачиваться с вытаскиванием.
2. Ты делаешь проверку, т.е. ты не уверен лежит ли у тебя в переменной логин? Так тогда можно каждую переменную так проверять. Значит изначально логика неправильно выстроена.
 
  • Спасибо
Реакции: Adigen

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Посмотрел код несколько раз, но если честно, так и не понял, зачем такие заморочки.
У тебя в этой переменной project.Variables["Login_seosprint"] я так понял находится логин.
Но не просто логин, а еще с приставкой [Login]=

Возникает два вопроса.
1. Зачем ложить в переменную не чистый логин, а еще с какой то приставкой, чтобы потом заморачиваться с вытаскиванием.
2. Ты делаешь проверку, т.е. ты не уверен лежит ли у тебя в переменной логин? Так тогда можно каждую переменную так проверять. Значит изначально логика неправильно выстроена.
Не мой код, я взял из предыдущей темы, но ситуации не имеет практически ничего общего с логинами, а приведена как пример. Хочу одной строчкой сделать проверку на -1 и тем же способом установить значение переменной в зависимости от этого (найденное после текста Login= или, например, оставить значение прежним или пустым). Мб тут через Where замутить, но я выхода не нашел.
P.S. на практике эта задачка часто встречается, когда нужно либо присвоить значение переменной сразу при её нахождении, либо произвести какое-либо другое действие с той же переменной.
Немного с простым Linq
C#:
string textbefore = "[Login]=";
return project.Variables["Login_seosprint"].Value.Split(new[] { textbefore }, StringSplitOptions.None).LastOrDefault();
только проблема будет когда там нет [Login]= он вернет всю строку
тогда надо смотреть на количество строк после Split их должно быть больше 1
Split не использую, потому что скорость его работы ниже, чем у IndexOf
 

Moadip

Client
Регистрация
26.09.2015
Сообщения
509
Благодарностей
824
Баллы
93
Хочу одной строчкой сделать проверку на -1 и тем же способом установить значение переменной в зависимости от этого (найденное после текста Login= или, например, оставить значение прежним или пустым). Мб тут через Where замутить, но я выхода не нашел.
Ну тогда только тернарный оператор, как в первом посте, раз уж хочется все в одну строчку, и все преобразования тоже в одну строчку.
Т.е. все что разбивается на несколько строк, при желании можно и в одну впихнуть.

Но имхо, это хреновый code style. Потом сам же будешь вспоминать а что это я хотел такого умного сделать в одной строчке.))
По мне так лучше написать несколько строк кода, пусть это будет не так компактно, зато понятно. И понятно спустя какое то время.

Split не использую, потому что скорость его работы ниже, чем у IndexOf
Как проверял? Как тестил?:-)
Тут думаю зависит от размера входной строки и что надо найти/сделать.
 
  • Спасибо
Реакции: Adigen

AShaggy

Активный пользователь
Регистрация
25.11.2014
Сообщения
335
Благодарностей
143
Баллы
43
Split не использую, потому что скорость его работы ниже, чем у IndexOf
если уж Вам сплит затратен, то пишите конечный автомат для разбора. и будет линейный алгоритм
Но не вижу смысла так морочить голову
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Ну тогда только тернарный оператор, как в первом посте, раз уж хочется все в одну строчку, и все преобразования тоже в одну строчку.
Т.е. все что разбивается на несколько строк, при желании можно и в одну впихнуть.
Но имхо, это хреновый code style. Потом сам же будешь вспоминать а что это я хотел такого умного сделать в одной строчке.))
По мне так лучше написать несколько строк кода, пусть это будет не так компактно, зато понятно. И понятно спустя какое то время.
Насчет читабельности кода согласен, но хочу увеличить скорость за счет мелочей
Как проверял? Как тестил?:-)Тут думаю зависит от размера входной строки и что надо найти/сделать.
До меня уже проверили, но при желании Stopwatcher запустить несложно. Ну да, зависит от размера строки, для малых строк так усложнять себе работу нету смысла, но бывает, когда проводишь большую работу по поиску текста среди множества элементов (можно использовать метод Бойера-Мура, но он для поиска строки в очень длинном тексте подходит только).
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Насчет читабельности кода согласен, но хочу увеличить скорость за счет мелочей
До меня уже проверили, но при желании Stopwatcher запустить несложно. Ну да, зависит от размера строки, для малых строк так усложнять себе работу нету смысла, но бывает, когда проводишь большую работу по поиску текста среди множества элементов (можно использовать метод Бойера-Мура, но он для поиска строки в очень длинном тексте подходит только).
Вы, имхо, в оптимизацию не с той стороны полезли, у вас поиск по дом, когда вы будете вставлять логин в инпут, сожрет больше ресурсов чем 100500 переменных;
Такое ощущение что у вас эта строчка будет дергаться по 10000 раз в секунду, что вы так печетесь о ее производительности.

На вскидку:
1. Использование доп переменной не замедляет работу, посмотрите скомпилированный код с переменной и без в IL.
2. Если код написан в одну строку, это не значит что он будет работать быстрее разбитого на части.
3. Если надо повысить производительность, используйте StringComparison.Ordinal, работает в разы быстрее.


А для вашего кода, читабельный и быстрый вариант выглядит так:
Код:
string textbefore = "[Login]=";
string loginVariable = project.Variables["Login_seosprint"].Value;
int k = loginVariable.IndexOf(textbefore, StringComparison.Ordinal);
return (k != -1) ? loginVariable.Substring(k + textbefore.Length) : null;

//или так 
string textbefore = "[Login]=";
var loginVariable = project.Variables["Login_seosprint"];
int k = loginVariable.Value.IndexOf(textbefore, StringComparison.Ordinal);
return (k != -1) ? loginVariable.Value.Substring(k + textbefore.Length) : null;
P.S. Если вам так сильно нужна скорость работы со строками смотрите в сторону StringBuiler, он намного быстрее чем string, но на таких размерах и от него толку не будет.
 
Последнее редактирование:
  • Спасибо
Реакции: Moadip

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
На вскидку:
1. Использование доп переменной не замедляет работу, посмотрите скомпилированный код с переменной и без в IL.
2. Если код написан в одну строку, это не значит что он будет работать быстрее разбитого на части.
3. Если надо повысить производительность, используйте StringComparison.Ordinal, работает в разы быстрее.
P.S. Если вам так сильно нужна скорость работы со строками смотрите в сторону StringBuiler, он намного быстрее чем string, но на таких размерах и от него толку не будет.
1) Запись в переменную работает немного медленнее, чем она находится в буфере, тем более сборщику мусора меньше работы.
2) Так и есть, одна строка не значит ничего, так как та же строка может являться полным аналогом 4 строк кода только за счет "синтаксического сахара".
3) Да я уже об этом описал выше, просто интересен как синтаксически можно реализовать предложенную мною задачку одновременно проверяя на наличие текста и запись в переменную в этом случае без создания промежуточных переменных.
Стрингбилдер выгоден при частом изменении 1 строки, так как там используется capacity (что-то похожее наблюдается в коллекции лист). И насчет читабельности кода я не очень волнуюсь, так как конструкция только с 1 раза кажется сложной.
Плюс поиск по DOM я не учитываю, так как это только пример, а реализация может быть совсем другой.
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
1) Запись в переменную работает немного медленнее, чем она находится в буфере, тем более сборщику мусора меньше работы.
Про запись и буфер, это вы сейчас о чем ??? , и заодно можно где-то увидеть тесты этого немного медленнее ?
А уж про сборщик на простых типах можно вобще не волноваться, как только кубик сниппета отработает, переменной и след простынет.

2) Так и есть, одна строка не значит ничего, так как та же строка может являться полным аналогом 4 строк кода только за счет "синтаксического сахара".
4 строки кода при компиляции могут выглядеть как одна в IL, за счет оптимизации компилятором,
А одна строка кода в с# может в IL выглядеть как нагрмождение непонятно чего с счем.
проверять надо не с# кодом а IL

3) Да я уже об этом описал выше, просто интересен как синтаксически можно реализовать предложенную мною задачку одновременно проверяя на наличие текста и запись в переменную в этом случае без создания промежуточных переменных.
Стрингбилдер выгоден при частом изменении 1 строки, так как там используется capacity (что-то похожее наблюдается в коллекции лист). И насчет читабельности кода я не очень волнуюсь, так как конструкция только с 1 раза кажется сложной.
Плюс поиск по DOM я не учитываю, так как это только пример, а реализация может быть совсем другой.
С вашими условиями никак, можно уйти от переменной, но "выигрыш" от ухода мы сразу теряем на двойном выполнении IndexOf.
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Про запись и буфер, это вы сейчас о чем ??? , и заодно можно где-то увидеть тесты этого немного медленнее ?
А уж про сборщик на простых типах можно вобще не волноваться, как только кубик сниппета отработает, переменной и след простынет.4 строки кода при компиляции могут выглядеть как одна в IL, за счет оптимизации компилятором,
А одна строка кода в с# может в IL выглядеть как нагрмождение непонятно чего с счем.
проверять надо не с# кодом а IL, а С вашими условиями никак, можно уйти от переменной, но "выигрыш" от ухода мы сразу теряем на двойном выполнении IndexOf.
Про буфер имею ввиду, что в моем случае идет запись в созданную в коде переменную и потом сравнение её с -1, а более быстрым вариантом считаю использование её в специальной области памяти, куда заносится переменная для произведения операций над ней.
Я доверяю больше stopwatcher и синтаксически правильному построению кода, тем более протестить, добавив пару строчек кода не составит труда, особенно хорошо тестить в цикле с тысячами одинаковых операций. Двойное использование indexof вообще окажется самым глупым решением, поэтому я о нем даже не задумывался.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
я думаю наверно надо тебе в ракетный форум )
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Про буфер имею ввиду, что в моем случае идет запись в созданную в коде переменную и потом сравнение её с -1, а более быстрым вариантом считаю использование её в специальной области памяти, куда заносится переменная для произведения операций над ней.
Я доверяю больше stopwatcher и синтаксически правильному построению кода, тем более протестить, добавив пару строчек кода не составит труда, особенно хорошо тестить в цикле с тысячами одинаковых операций. Двойное использование indexof вообще окажется самым глупым решением, поэтому я о нем даже не задумывался.
Я даже не хочу спрашивать где-вы такого набрались, и причем тут мухи к котлетам тем более.

Учите матчасть.
 
Последнее редактирование:
  • Спасибо
Реакции: Moadip

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Берем 2 функции, одна создает переменную, потом возвращает, вторая возвращает без создания переменной.
Запускаем в 1 МИЛЛИАРД циклов !!!!

C#:
System.Diagnostics.Stopwatch sw;
Func<int> withoutVariable = () =>
{
    return 1;
};

Func<int> withVariable = () =>
{
    int s = 1;
    return s;
};

sw = System.Diagnostics.Stopwatch.StartNew();
for (var i = 0; i < 1000000000; i++)
    withoutVariable();
sw.Stop();
project.SendInfoToLog("Without variable: " + sw.Elapsed.TotalMilliseconds);

sw = System.Diagnostics.Stopwatch.StartNew();
for (var i = 0; i < 1000000000; i++)
    withVariable();
sw.Stop();
project.SendInfoToLog("With variable: "+sw.Elapsed.TotalMilliseconds);

Результаты:
Код:
Тип Время Путь Сообщение
02:47:23 Without variable: 3161,5246
02:47:26 With variable: 3188,9194
02:47:26 Выполнение кода C# действия id: 5aa032ce-aae3-4a1c-9982-a038250581a5 группы действий id: 9a5fcb31-aa26-413f-bd70-443584e5f952 Результат: ok
02:47:48 Without variable: 3161,9071
02:47:51 With variable: 3156,8043
02:47:51 Выполнение кода C# действия id: 5aa032ce-aae3-4a1c-9982-a038250581a5 группы действий id: 9a5fcb31-aa26-413f-bd70-443584e5f952 Результат: ok
02:49:40 Without variable: 3451,8066
02:49:44 With variable: 3440,8399
02:49:44 Выполнение кода C# действия id: 5aa032ce-aae3-4a1c-9982-a038250581a5 группы действий id: 9a5fcb31-aa26-413f-bd70-443584e5f952 Результат: ok

Где тут разница ?
все различия в пределах статистической погрешности, т.к. на компе работает еще куча другого софта, причем то быстрее один вариант то другой.
 
Последнее редактирование:

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Берем 2 функции, одна создает переменную, потом возвращает, вторая возвращает без создания переменной.
Запускаем в 1 МИЛЛИАРД циклов !!!!

C#:
System.Diagnostics.Stopwatch sw;
Func<int> withoutVariable = () =>
{
    return 1;
};

Func<int> withVariable = () =>
{
    int s = 1;
    return s;
};

sw = System.Diagnostics.Stopwatch.StartNew();
for (var i = 0; i < 1000000000; i++)
    withoutVariable();
sw.Stop();
project.SendInfoToLog("Without variable: " + sw.Elapsed.TotalMilliseconds);

sw = System.Diagnostics.Stopwatch.StartNew();
for (var i = 0; i < 1000000000; i++)
    withVariable();
sw.Stop();
project.SendInfoToLog("With variable: "+sw.Elapsed.TotalMilliseconds);

Результаты:
Код:
Тип Время Путь Сообщение
02:47:23 Without variable: 3161,5246
02:47:26 With variable: 3188,9194
02:47:26 Выполнение кода C# действия id: 5aa032ce-aae3-4a1c-9982-a038250581a5 группы действий id: 9a5fcb31-aa26-413f-bd70-443584e5f952 Результат: ok
02:47:48 Without variable: 3161,9071
02:47:51 With variable: 3156,8043
02:47:51 Выполнение кода C# действия id: 5aa032ce-aae3-4a1c-9982-a038250581a5 группы действий id: 9a5fcb31-aa26-413f-bd70-443584e5f952 Результат: ok
02:49:40 Without variable: 3451,8066
02:49:44 With variable: 3440,8399
02:49:44 Выполнение кода C# действия id: 5aa032ce-aae3-4a1c-9982-a038250581a5 группы действий id: 9a5fcb31-aa26-413f-bd70-443584e5f952 Результат: ok

Где тут разница ?
все различия в пределах статистической погрешности, т.к. на компе работает еще куча другого софта, причем то быстрее один вариант то другой.
Вот это реально полезная инфа, всегда думал по-другому и в инете такую инфу в уроках по c# не рассказывали. Теперь буду знать, что скорость обработки одинаковая в таком случае, спасибо за тест, буду применять эту инфу в том, чтобы достигать максимальной производительности.
 

AShaggy

Активный пользователь
Регистрация
25.11.2014
Сообщения
335
Благодарностей
143
Баллы
43
Берем 2 функции, одна создает переменную, потом возвращает, вторая возвращает без создания переменной.
Запускаем в 1 МИЛЛИАРД циклов !!!!

C#:
System.Diagnostics.Stopwatch sw;
Func<int> withoutVariable = () =>
{
    return 1;
};

Func<int> withVariable = () =>
{
    int s = 1;
    return s;
};

sw = System.Diagnostics.Stopwatch.StartNew();
for (var i = 0; i < 1000000000; i++)
    withoutVariable();
sw.Stop();
project.SendInfoToLog("Without variable: " + sw.Elapsed.TotalMilliseconds);

sw = System.Diagnostics.Stopwatch.StartNew();
for (var i = 0; i < 1000000000; i++)
    withVariable();
sw.Stop();
project.SendInfoToLog("With variable: "+sw.Elapsed.TotalMilliseconds);

Результаты:
Код:
Тип Время Путь Сообщение
02:47:23 Without variable: 3161,5246
02:47:26 With variable: 3188,9194
02:47:26 Выполнение кода C# действия id: 5aa032ce-aae3-4a1c-9982-a038250581a5 группы действий id: 9a5fcb31-aa26-413f-bd70-443584e5f952 Результат: ok
02:47:48 Without variable: 3161,9071
02:47:51 With variable: 3156,8043
02:47:51 Выполнение кода C# действия id: 5aa032ce-aae3-4a1c-9982-a038250581a5 группы действий id: 9a5fcb31-aa26-413f-bd70-443584e5f952 Результат: ok
02:49:40 Without variable: 3451,8066
02:49:44 With variable: 3440,8399
02:49:44 Выполнение кода C# действия id: 5aa032ce-aae3-4a1c-9982-a038250581a5 группы действий id: 9a5fcb31-aa26-413f-bd70-443584e5f952 Результат: ok

Где тут разница ?
все различия в пределах статистической погрешности, т.к. на компе работает еще куча другого софта, причем то быстрее один вариант то другой.
такая функция не показатель. Оптимизатор кода ее схлопнет. По сути и первая и вторая в итоге получатся одинаковыми.
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
такая функция не показатель. Оптимизатор кода ее схлопнет. По сути и первая и вторая в итоге получатся одинаковыми.
вполне возможно, что во 2 случае код станет одинаковым с 1, надо другой код придумать
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
такая функция не показатель. Оптимизатор кода ее схлопнет. По сути и первая и вторая в итоге получатся одинаковыми.
C#:
System.Diagnostics.Stopwatch sw;
Func<int> getVar = () =>
{
    return 3;
};

Func<int, int> withVariable = (int input) =>
{
    int var1 = 5;
    int s = input + var1;
    int y = s + getVar();
    return y;
};

Func <int,int> withoutVariable = (int input) =>
{
    return getVar();
};

sw = System.Diagnostics.Stopwatch.StartNew();
for (var i = 0; i < 1000000000; i++)
    withoutVariable(5);
sw.Stop();
project.SendInfoToLog("Without variable: " + sw.Elapsed.TotalMilliseconds);

sw = System.Diagnostics.Stopwatch.StartNew();
for (var i = 0; i < 1000000000; i++)
    withVariable(5);
sw.Stop();
project.SendInfoToLog("With variable: "+sw.Elapsed.TotalMilliseconds);
Такая показательна ?
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
да простое промежуточная переменая ускоряет но ни ни как не затормаживает
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Я взял такую функцию:

Код:
System.Diagnostics.Stopwatch sw;
int l = 1;
string str = "1[Login]=123";
int k;
Func<string> withoutVariable = () =>
{
    string textbefore = "[Login]=";
    return (str.IndexOf(textbefore, StringComparison.Ordinal) != -1) ? str.Substring(l + textbefore.Length) : string.Empty;
};
Func<string> withVariable = () =>
{
    string textbefore = "[Login]=";
    k = str.IndexOf(textbefore, StringComparison.Ordinal);
    return (k != -1) ? str.Substring(k + textbefore.Length) : string.Empty;
};
sw = System.Diagnostics.Stopwatch.StartNew();
for (var i = 0; i < 50000000; i++)
    withoutVariable();
sw.Stop();
project.SendInfoToLog("Without variable: " + sw.Elapsed.TotalMilliseconds);
sw = System.Diagnostics.Stopwatch.StartNew();
for (var i = 0; i < 50000000; i++)
    withVariable();
sw.Stop();
project.SendInfoToLog("With variable: "+sw.Elapsed.TotalMilliseconds);
и как не игрался с параметром в 1 функции (подставлял уже готовое число даже) и все равно разница была на 1.5-2% быстрее при 1 варианте (в-среднем 7300 и 7500 выдавало в 1 и во 2 случае), но не больше, так что можно сказать, что запись в переменную практически не сказывается на производительности при работе с моим примером кода.
Но тут основа всех операция была работа с indexof, так что может быть при реальной работе с числовыми вычислениями разница вырастет до 10-20%
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
да ржачно
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
653
Баллы
93
Я взял такую функцию:

Код:
System.Diagnostics.Stopwatch sw;
int l = 1;
string str = "1[Login]=123";
int k;
Func<string> withoutVariable = () =>
{
    string textbefore = "[Login]=";
    return (str.IndexOf(textbefore, StringComparison.Ordinal) != -1) ? str.Substring(l + textbefore.Length) : string.Empty;
};
Func<string> withVariable = () =>
{
    string textbefore = "[Login]=";
    k = str.IndexOf(textbefore, StringComparison.Ordinal);
    return (k != -1) ? str.Substring(k + textbefore.Length) : string.Empty;
};
sw = System.Diagnostics.Stopwatch.StartNew();
for (var i = 0; i < 50000000; i++)
    withoutVariable();
sw.Stop();
project.SendInfoToLog("Without variable: " + sw.Elapsed.TotalMilliseconds);
sw = System.Diagnostics.Stopwatch.StartNew();
for (var i = 0; i < 50000000; i++)
    withVariable();
sw.Stop();
project.SendInfoToLog("With variable: "+sw.Elapsed.TotalMilliseconds);
и как не игрался с параметром в 1 функции (подставлял уже готовое число даже) и все равно разница была на 1.5-2% быстрее при 1 варианте (в-среднем 7300 и 7500 выдавало в 1 и во 2 случае), но не больше, так что можно сказать, что запись в переменную практически не сказывается на производительности при работе с моим примером кода.
Но тут основа всех операция была работа с indexof, так что может быть при реальной работе с числовыми вычислениями разница вырастет до 10-20%
Вот я взял и запустил ваш код:
Код:
Тип    Время    Путь    Сообщение
    11:51:54        Without variable: 5208,2081
    11:52:00        With variable: 5175,2726
    11:52:00    Выполнение кода C# действия id: 4004f507-95cd-43a4-bbf4-9c20d2957818 группы действий id: 2baaa078-a5c9-4683-adfd-d9e6ecf82bdc    Результат: ok
    11:52:08        Without variable: 5404,1955
    11:52:14        With variable: 5168,0243
    11:52:14    Выполнение кода C# действия id: 4004f507-95cd-43a4-bbf4-9c20d2957818 группы действий id: 2baaa078-a5c9-4683-adfd-d9e6ecf82bdc    Результат: ok
    11:52:23        Without variable: 5222,6177
    11:52:28        With variable: 5307,8436
    11:52:28    Выполнение кода C# действия id: 4004f507-95cd-43a4-bbf4-9c20d2957818 группы действий id: 2baaa078-a5c9-4683-adfd-d9e6ecf82bdc    Результат: ok
В упор не вижу, разницы.
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
разница в том что у человека всё на чистом при чистом C# работает в +100500 разы быстрее, только не понял я его я его C# ирспользуля браузер
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
Вот я взял и запустил ваш код:
Код:
Тип    Время    Путь    Сообщение
    11:51:54        Without variable: 5208,2081
    11:52:00        With variable: 5175,2726
    11:52:00    Выполнение кода C# действия id: 4004f507-95cd-43a4-bbf4-9c20d2957818 группы действий id: 2baaa078-a5c9-4683-adfd-d9e6ecf82bdc    Результат: ok
    11:52:08        Without variable: 5404,1955
    11:52:14        With variable: 5168,0243
    11:52:14    Выполнение кода C# действия id: 4004f507-95cd-43a4-bbf4-9c20d2957818 группы действий id: 2baaa078-a5c9-4683-adfd-d9e6ecf82bdc    Результат: ok
    11:52:23        Without variable: 5222,6177
    11:52:28        With variable: 5307,8436
    11:52:28    Выполнение кода C# действия id: 4004f507-95cd-43a4-bbf4-9c20d2957818 группы действий id: 2baaa078-a5c9-4683-adfd-d9e6ecf82bdc    Результат: ok
В упор не вижу, разницы.
Ну я раз 20 запускал, у меня результаты выше оказывались в 1 случае почти всегда на 100-200 мс
разница в том что у человека всё на чистом при чистом C# работает в +100500 разы быстрее, только не понял я его я его C# ирспользуля браузер
Самый чистый c# на свете)) В VS в-среднем скорость выполнения составляет 6900 против 7500 в PM.
P.S. рука у тебя ещё не зажила что ли?
P.S.S: в прикрепленном файле вирусы, чтобы украсть ваши данные)) шучу, там скомпилированный код для теста
 

Вложения

Последнее редактирование:

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
Ну я раз 20 запускал, у меня результаты выше оказывались в 1 случае почти всегда на 100-200 мс
Самый чистый c# на свете)) В VS в-среднем скорость выполнения составляет 6900 против 7500 в PM.
P.S. рука у тебя ещё не зажила что ли?
время выполнения как тебе озвучили может меняться, так как у тебя комп может друкгим ещё процессом занят, если не так то докапжкажи скрином в цикле 10 раз и значение будут одни и те же
а при чём моя рука, вроде по клаве левой получвается кликать пока
 

amyboose

Client
Регистрация
21.04.2016
Сообщения
2 312
Благодарностей
1 191
Баллы
113
время выполнения как тебе озвучили может меняться, так как у тебя комп может друкгим ещё процессом занят, если не так то докапжкажи скрином в цикле 10 раз и значение будут одни и те же
а при чём моя рука, вроде по клаве левой получвается кликать пока
ну может меняться, но при большом количестве тестов погрешность измерений сводится к нулю
 

ssXXXss

Client
Регистрация
23.12.2014
Сообщения
7 379
Благодарностей
2 041
Баллы
113
В VS в-среднем скорость выполнения составляет 6900 против 7500 в PM.
смешно об этом говорить, а если я за мепьшее сделаю чем студия ты 10к бваксосов выложишь ????
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)