The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

В рамках проекта gonix, развивается реализация unix-утилит н..., opennews (??), 09-Май-15, (0) [смотреть все] –1

Сообщения [Сортировка по времени | RSS]


25. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от soarin (ok), 09-Май-15, 17:15 
echo:
for i := 1; i < len(os.Args); i++ { fmt.Printf("%s ", os.Args[i]) }

В конце лишний пробл добавится в итоге. Это нормально?

Ответить | Правка | Наверх | Cообщить модератору

27. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Аноним (-), 09-Май-15, 17:34 
Вот еще фееричная вещь из реализации yes:
for i := 1; i < len(os.Args); i++
Ответить | Правка | Наверх | Cообщить модератору

28. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Аноним (-), 09-Май-15, 17:37 
Дурачку невдомёк, что os.Args[0] это имя исполняемого файла? Тогда чего он лезет судить других людей?
Ответить | Правка | Наверх | Cообщить модератору

29. "В рамках проекта gonix, развивается реализация unix-утилит н..."  –1 +/
Сообщение от Аноним (-), 09-Май-15, 17:40 
Nope. Это умнику невдомек, что функция len будет вызываться при каждой итерации.
Ответить | Правка | Наверх | Cообщить модератору

32. "В рамках проекта gonix, развивается реализация unix-утилит н..."  –1 +/
Сообщение от Аноним. (?), 09-Май-15, 18:22 
Пруф? Думаю, компилятор в состоянии это соптемизировать. К примеру gcc могет соптемизировать for(int i = a; a < b; ++i)
++N;
До N = b - a - 1. В контексте задачи нахождения количества чисел от а до b (видел где-то такое чудо решение на просторах интернетов).
Ответить | Правка | Наверх | Cообщить модератору

37. "В рамках проекта gonix, развивается реализация unix-утилит н..."  –1 +/
Сообщение от soarin (ok), 09-Май-15, 18:50 
дурацкий пример, ибо весьма простой, а вот как раз компилятор вряд ли станет оптимизировать вызовы функций (раньше по крайней мере на это не были способны), потому что функция само по себе по мимо возврата результат числа через стек может делать другую работу типа записи в файл и т.д. и т.п
Ответить | Правка | Наверх | Cообщить модератору

39. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +3 +/
Сообщение от Аноним (-), 09-Май-15, 18:58 
Пруф чего? Если длина строки заранее неизвестна, то каким образом компилятор сможет оптимизировать вызов функции внутри оператора for? Вынести len за пределы цикла, изменяя тем самым семантику программы, что для любого уважающего себя компилятора моветон? А если длина строки изменится внутри цикла, что тогда?

Вот простой пример того, что GCC с флагом -O3 бессилен в таких случаях. В ассемблерном листинге четко виден вызов strlen внутри цикла.

Ответить | Правка | К родителю #32 | Наверх | Cообщить модератору

42. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от soarin (ok), 09-Май-15, 19:06 
> А если длина строки изменится внутри цикла, что тогда?

На самом деле код есть априори и из него понятно что строка константная, тоесть так можно сделать.
Но да, для компилятора - это слишком круто. А поколение, выбирающие пепСИ и го, без знания ассемблера и принципов компилятора, это не знает - есть такое.

Ответить | Правка | Наверх | Cообщить модератору

57. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Аноним (-), 09-Май-15, 21:13 
Это потому что gcc не имеет права инлайнить strlen, а не имеет он его потому, что сишный рантайм общий на всю систему. А б-гомерзкий MSVC такой инлайн прекрасно делает и на -O0, а на -O3 вычисляет длину argv[i] один раз, а не каждый раз в цикле.
Ответить | Правка | К родителю #39 | Наверх | Cообщить модератору

61. "В рамках проекта gonix, развивается реализация unix-утилит н..."  –1 +/
Сообщение от Аноним (-), 09-Май-15, 21:18 
То есть, у тебя компилятор вычисляет длину передаваемого в рантайме аргумента еще до того, как он был передан?
Ответить | Правка | Наверх | Cообщить модератору

110. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Пингвино (ok), 10-Май-15, 17:14 
Ты дурачок? Компилятор оптимизирует код так, чтобы в рантайме значение вычислялось всего один раз
Ответить | Правка | Наверх | Cообщить модератору

63. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Аноним (-), 09-Май-15, 21:30 
Хотя, кажется я понял, что ты имеешь в виду.
Но все равно, при чем тут инлайн? Если мы вычисляем длину _константной_ строки, то любой вменяемый компилятор такой вызов оптимизирует и заменит вызов функции на ее значение. Но с длиной динамического массива такой фокус не пройдет. Теперь внимание, вопрос: как твой компилятор отличает argv от других массивов?
Ответить | Правка | К родителю #57 | Наверх | Cообщить модератору

68. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Аноним (-), 09-Май-15, 22:09 
У него есть argc. %)

А если серьезно, то и с длиной динамического массива такой фокус тоже, разумеется пройдет — если эту длину в теле цикла не менять, и других потоков выполнения не иметь (или иметь, но знать, что они тоже ее не меняют).

Ответить | Правка | Наверх | Cообщить модератору

69. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Аноним (-), 09-Май-15, 22:14 
И вообще, os.Args — это не динамический массив. Он статический.
Ответить | Правка | К родителю #63 | Наверх | Cообщить модератору

74. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Аноним (-), 09-Май-15, 22:41 
os.Args - слайс в терминологии Go, то есть вполне себе динамический массив
Ответить | Правка | Наверх | Cообщить модератору

76. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Аноним (-), 09-Май-15, 23:32 
Нет, он []string. И слайсы не могут вырасти больше чем capacity, а capacity неизменна.

Если вам нужно увеличить длину массива, все, что вы можете — это сделать append, но он возвращает новый массив, а старый остается без изменений.

Ответить | Правка | Наверх | Cообщить модератору

103. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Аноним (-), 10-Май-15, 13:29 
А как еще могут работать динамические массивы?
Ответить | Правка | Наверх | Cообщить модератору

82. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Алексей Морозов (ok), 10-Май-15, 05:54 
> Это потому что gcc не имеет права инлайнить strlen

-D__USE_STRING_INLINES, после чего включается машинерия в /usr/include/bits/string.h

Ответить | Правка | К родителю #57 | Наверх | Cообщить модератору

40. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Аноним (-), 09-Май-15, 18:59 
Забыл пример.
http://pastebin.com/wZKuu00q
Ответить | Правка | К родителю #32 | Наверх | Cообщить модератору

83. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Аноним (-), 10-Май-15, 07:07 
Оптимизоровать можно только детерминированные ф-ции, т.е. результат которых зависит ислючительно от аргументов. В Го есть механизм указания детерминированности?
Ответить | Правка | К родителю #32 | Наверх | Cообщить модератору

93. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Аноним (-), 10-Май-15, 09:08 
> соптемизировать.

Go'пники оказывается надеются что за них "оптемизирует" компилер. А то и вовсе "оптемезерует".

> К примеру gcc могет соптемизировать
> for(int i = a; a < b; ++i)

И в каком месте тут был вызов функции? Тут все параметры фиксированные, заранее известные, можно каой-нибудь unroll цикла сделать (от чего в половине случаев на половине процессоров нынче станет хуже а не лучше), сэкономив на инструкциях jump в конце цикла (но раздув код, так что если не влезет в кэш, эффект от экономии jmp-ов может проcpaться).

> количества чисел от а до b (видел где-то такое чудо решение
> на просторах интернетов).

Может ты еще и развороты циклов видел? В случае вызова функции проблема в том что оптимизатор должен быть чуть ли не AI чтобы понять что она всегда возвращает одно и то же.

Ответить | Правка | К родителю #32 | Наверх | Cообщить модератору

140. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Аноним (-), 12-Май-15, 12:55 
>В случае вызова функции проблема в том что оптимизатор должен быть чуть ли не AI чтобы понять что она всегда возвращает одно и то же.

AI не нужен. Можно определить детерменированную функцию как только такую, в которой для вычисления результата используются только детерменированные операции в своем теле (+ - * и т.п.) и вызовы других детерменированных функций и не имеет никаких других операций и вызовов.
Результат такой функции будет зависит исключительно от ее аргументов и не иметь побочных эффектов.

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

Я просто не знаю может ли так Го.

Ответить | Правка | Наверх | Cообщить модератору

55. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +2 +/
Сообщение от Аноним (-), 09-Май-15, 21:10 
это вам невдомек, что иногда лучше жевать. В го функция len работает за константу.

Эксперты opennet в очередной раз расписались в своей полной некомпетентности))

Ответить | Правка | К родителю #29 | Наверх | Cообщить модератору

62. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Аноним (-), 09-Май-15, 21:21 
Да уж, тяжелая судьбинушка у этой функции. Ничего не скажешь.
А если ей передать в качестве аргумента динамический массив, то она тоже "за константу сработает"?
Ответить | Правка | Наверх | Cообщить модератору

65. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Аноним (-), 09-Май-15, 21:51 
Представь себе.
Ответить | Правка | Наверх | Cообщить модератору

67. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Аноним (-), 09-Май-15, 22:02 
Ясно.
А теперь, пожалуйста, компетентно поясните: какой смысл Вы вкладываете во фразу "работает за константу"?
Ответить | Правка | Наверх | Cообщить модератору

72. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +1 +/
Сообщение от Аноним (-), 09-Май-15, 22:28 
Я не тот аноним, но факт в том, "динамические массивы" в Го содержат длину как переменную в структуре. Так что "работает за константу", видимо подразумевает, не зависит от количества элементов.
Ответить | Правка | Наверх | Cообщить модератору

73. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Аноним (-), 09-Май-15, 22:32 
курите маны: http://blog.golang.org/go-slices-usage-and-internals
Ответить | Правка | К родителю #67 | Наверх | Cообщить модератору

70. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Аноним (-), 09-Май-15, 22:15 
> Да уж, тяжелая судьбинушка у этой функции. Ничего не скажешь.
> А если ей передать в качестве аргумента динамический массив, то она тоже
> "за константу сработает"?

В го массивы статические.

Ответить | Правка | К родителю #62 | Наверх | Cообщить модератору

96. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от Аноним (-), 10-Май-15, 11:24 
А где тогда динамические?
Ответить | Правка | Наверх | Cообщить модератору

119. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от BratSinot (ok), 10-Май-15, 21:02 
> А где тогда динамические?
>> курите маны: http://blog.golang.org/go-slices-usage-and-internals
Ответить | Правка | Наверх | Cообщить модератору

81. "В рамках проекта gonix, развивается реализация unix-утилит н..."  +/
Сообщение от freehckemail (ok), 10-Май-15, 03:00 
> Nope. Это умнику невдомек, что функция len будет вызываться при каждой итерации.

А вот макрос loop в Common Lisp такие ситуации умеет обрабатывать. И код становится очень даже приятно читаем. =)

Ответить | Правка | К родителю #29 | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру