Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / WinForms, .Net Framework Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Есть ли смысл оптимизировать такие строчки кода ?  [new]
WaspNewCore
Member

Откуда:
Сообщений: 93
Есть такой код:

var sql = sb.ToString() + $@" SELECT F.Id, M.name                                
                            FROM F join M....                            
                            ORDER BY .. OFFSET ... ROWS FETCH NEXT ... ROWS ONLY;";
var cSql = sb.ToString() + @"Select count(*)
                                 FROM F;";


В StringBuilder формируется сложный текст запроса. На выходе нужно получить 2 текста отличающиеся только последними строчками.

Будет ли данное решение (с вызовом sb.ToString и последующей конкатенацией) достаточно быстрой ? Насколько двойной вызов sb.ToString ударит по производительности ? Есть ли смысл сохранить эту строку сначала во временную переменную и затем уже конкатенировать с последующими ?

В идеале мне бы хотелось, чтобы вся работа шла непосредственно в StringBuilder, но не придумал ничего лучше такого варианта:
sb.AppendLine(" %$ReplaceString$% ");
var temp = sb.ToString();

Regexp rg = ...
var sql = rg.replace ("%$ReplaceString$%", "select ...");
var сSql = rg.replace ("%$ReplaceString$%", "select ...");


Будет ли ускорение ? Сомневаюсь.

Какие еще варианты могут быть ?
6 дек 18, 12:57    [21755688]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3048
что мешает зареплейсить прямо в StringBuilder'е? там это будет на много быстрее.
6 дек 18, 13:34    [21755743]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
WaspNewCore
Member

Откуда:
Сообщений: 93
Roman Mejtes,

Мешает то, что мне нужно получить 2 результата а не один. После первого реплейса я затру "%$ReplaceString$%" в билдере, и как тогда получу второй результат, реплейсить ведь уже нечего будет. В этом и проблема. Или я ошибаюсь ?
6 дек 18, 14:00    [21755784]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
WaspNewCore
Member

Откуда:
Сообщений: 93
Т.е. если в sb хранится строка "Hello %name%", после первого реплейса там будет "Hello Петя". Применить в этому sb снова реплейс не выйдет, строки подстановки уже не будет. В этом и отличие StringBuilder'a от regexp. Поэтому я и делаю ToString 2 раза.
6 дек 18, 14:03    [21755790]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19545
Если формирование этих строк идет в цикле с сотней тысяч итераций, то выглядит это странным.
А если это однократная операция в ответ на клик пользователя, то пофиг на пару миллисекунд, по сравнению с выборкой из БД - вообще ни о чем
6 дек 18, 14:05    [21755793]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
fkthat
Member

Откуда:
Сообщений: 247
Какой смысл оптимизировать, если запрос к БД все равно будет в стопиццот раз медленней любых манипуляций со строками.
6 дек 18, 14:08    [21755801]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
WaspNewCore
Member

Откуда:
Сообщений: 93
Shocker.Pro,

Второй вариант.
Ну я понимаю, что одиночное выполнение не сильно критично. Просто стало интересно, как бы найти решение по лучше. Его нет ?
6 дек 18, 14:08    [21755802]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
WaspNewCore
Member

Откуда:
Сообщений: 93
fkthat,

Просто так (с). мультик такой есть, про котенка )
6 дек 18, 14:08    [21755803]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
Roman Mejtes
Member

Откуда: г. Пермь
Сообщений: 3048
дело не только оптимизации, но и в "говнокодности". Все эти "реплейсы" строк, это говнокод однозначный.
Если у вас формируется сложный запрос, формируйте его прямо в SB последовательно.
Заполняя строку слева направо непрерывно и без всяких реплейсов.
6 дек 18, 14:14    [21755810]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
WaspNewCore
Member

Откуда:
Сообщений: 93
Roman Mejtes,

Так я это и делаю.

На выходе мне нужно получить 2 запроса. Запросы отличаются лишь последними строчками.
Первый это чистый Select со списком полей и пагинацией. А второй это Count(*) по всем сущностям попадающим в выборку. Я привел пример как это выглядит в коде.
6 дек 18, 14:17    [21755819]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
Arm79
Member

Откуда: МО, Раменское
Сообщений: 3548
А сервер БД не поддерживает Multiply Recordset?
6 дек 18, 14:44    [21755860]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
WaspNewCore
Member

Откуда:
Сообщений: 93
Arm79,

Хм. А что это такое ?
Использую MS Sql - скорее всего последней версии или около того, не помню какая именно там версия.
6 дек 18, 14:55    [21755877]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
WaspNewCore
Member

Откуда:
Сообщений: 93
Arm79,

Можете объяснить как это можно было бы использовать ? Интересно.
6 дек 18, 14:55    [21755878]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
Arm79
Member

Откуда: МО, Раменское
Сообщений: 3548
я предположил, что можно разом отправить на сервер 2 запроса, и от сервера сразу получить ответ
тогда вопросы "оптимальности" генерирования запросов должны потерять актуальность
6 дек 18, 15:02    [21755892]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19545
Arm79
я предположил, что можно разом отправить на сервер 2 запроса, и от сервера сразу получить ответ
тогда вопросы "оптимальности" генерирования запросов должны потерять актуальность
Да, тут выигрыш будет на порядок выше, чем при построении строки )
6 дек 18, 15:04    [21755897]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
WaspNewCore
Member

Откуда:
Сообщений: 93
Arm79,

А вы про то, чтобы сразу в БД послать несколько запросов, и получить на каждый из них свой сет-ответ. Да, конечно такое есть. Но это уже другая оптимизация, которую мне стати тоже стоит провести.

Но сейчас вопрос про более раннюю стадию - как эффективно сформировать эти SQL запросы. Нужно получить 2 почти идентичных запроса, отличающихся только последней строчкой. Запросы формируются в StringBuilder'e и затем нужно придумать эффективное решение, как из полученного StringBuilder'а получить на выход 2 итоговые строки.
6 дек 18, 15:06    [21755901]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
Arm79
Member

Откуда: МО, Раменское
Сообщений: 3548
WaspNewCore
А вы про то, чтобы сразу в БД послать несколько запросов, и получить на каждый из них свой сет-ответ

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


WaspNewCore
как эффективно сформировать эти SQL запросы. Нужно получить 2 почти идентичных запроса, отличающихся только последней строчкой. Запросы формируются в StringBuilder'e и затем нужно придумать эффективное решение, как из полученного StringBuilder'а получить на выход 2 итоговые строки

Оптимально не использовать никакой StringBuilder вообще в этой задаче. От него есть польза, если в процессе редактирования требуется влезать внутрь сформированной строки, для вставки/редактирования. А если обычная конкатенация, то плюсы от него видны только при сотнях операций, чего при формировании запроса быть не должно. В вашем случае StringBuilder может и шустрее, но просто приведет к ненаглядности кода. А разница в скорости настолько ничтожна, что ей можно пренебречь
6 дек 18, 15:13    [21755912]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
WaspNewCore
Member

Откуда:
Сообщений: 93
Arm79,

Вы предлагаете отказаться от кучи
sb.AppendLine...
sb.AppendLine...
sb.AppendLine...

И заменить их на кучу конкатенации ? Нет уж. Как раз тут StringBuilder полезно использовать. У меня там запрос динамически формируется и текст выходит весьма большой.
6 дек 18, 15:17    [21755922]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
Arm79
Member

Откуда: МО, Раменское
Сообщений: 3548
Ну, дело ваше. Зачем тогда спрашивать совета, если вы все решили?
6 дек 18, 15:22    [21755938]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
Shocker.Pro
Member

Откуда: ->|<- :адуктО
Сообщений: 19545
Не надо всё усложнять. Эта задача удобно решается через подстановки ($"{n}") и пофик на пару сотен микросекунд. Удобство сопровождения кода гораздо важнее.
6 дек 18, 15:25    [21755940]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
WaspNewCore
Member

Откуда:
Сообщений: 93
Shocker.Pro,

так в том и суть, что после первой подстановки мы теряем это ($"{n}") и получаем "Вася". Поэтому мне и приходится делать
sb.ToString() +"select name, id, ..."
sb.ToString() +"select count(*)"


Т.е. мне приходится сохранить исходную строку в двух экземплярах а потом к каждому конкатенатить различающиеся.

Поэтому то я и спрашиваю как сделать лучше. В этом и вопрос !
6 дек 18, 15:28    [21755947]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
WebPrj
Member

Откуда:
Сообщений: 320
WaspNewCore
Arm79,

Вы предлагаете отказаться от кучи
sb.AppendLine...
sb.AppendLine...
sb.AppendLine...

И заменить их на кучу конкатенации ? Нет уж. Как раз тут StringBuilder полезно использовать. У меня там запрос динамически формируется и текст выходит весьма большой.

Еще раз повторю что вам сказали.
Если append не тысячи раз, то красивее будет:
s += "select";
s += " where cccc" ;
Ну или первый builder выкинуть в s и потом склеить со вторым.
6 дек 18, 15:29    [21755948]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
WaspNewCore
Member

Откуда:
Сообщений: 93
Arm79
Ну, дело ваше. Зачем тогда спрашивать совета, если вы все решили?


Ну как решил.
Я просто сделал так. но я спрашиваю - как лучше.
6 дек 18, 15:29    [21755950]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
fkthat
Member

Откуда:
Сообщений: 247
WaspNewCore
Shocker.Pro,

так в том и суть, что после первой подстановки мы теряем это ($"{n}") и получаем "Вася". Поэтому мне и приходится делать
sb.ToString() +"select name, id, ..."
sb.ToString() +"select count(*)"


Т.е. мне приходится сохранить исходную строку в двух экземплярах а потом к каждому конкатенатить различающиеся.

Поэтому то я и спрашиваю как сделать лучше. В этом и вопрос !


Блин, да напиши ты просто:

var sql = sb.ToString();
sql +"select name, id, ..."
sql +"select count(*)"


и не парься.

У тебя вообще там что - в стрингбилдере запрос в гигабайт символов что ли, что ты так этим заморочился?
6 дек 18, 15:33    [21755956]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли смысл оптимизировать такие строчки кода ?  [new]
WaspNewCore
Member

Откуда:
Сообщений: 93
fkthat,

Ну в общем об этом я и спросил.

Мне просто хочется понять как будет эффективней. Это не вопрос жизни и смерти и всего всего )
6 дек 18, 15:42    [21755970]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / WinForms, .Net Framework Ответить