[image]

Си. Преобразование из массива char в int.

 
1 2 3 4 5

digger

аксакал

>IntelliJ IDEA

По отзывам, с Андроидом у него еще хуже.
   3.6.83.6.8
tarasv> вместе с убиранием обращения к размеру массива каждый раз
Не, этого я не дам, ускоряет не намного, а код загромождает.
   

tarasv

аксакал

GOGI> Не, этого я не дам, ускоряет не намного, а код загромождает.

Я бы не сказал что в 6 раз (30мс вместно 180) это не намного. :D
   3.6.253.6.25
+
-
edit
 

arkhnchul

втянувшийся

GOGI> Не, этого я не дам, ускоряет не намного, а код загромождает.

намного. Не верите на слово - посмотрите дебаггером, или что там для васика есть, в какой машинный код выливается и то, и другое.

офф "код загромождает, не буду так делать" - ну вот поэтому у нас теперь для каждой ерунды типа ворда надо "два ядра и два гига"...
   9.0.19.0.1
RU Серокой #25.01.2012 11:57  @GOGI#06.12.2011 23:00
+
-
edit
 

Серокой

координатор
★★★★
GOGI> Я на IAR
ОФФ: А не пробовал просто AVR Studio со встроенным GCC? Я вот хочу на нём новый проект начать... Всё равно ж для отладки объектники грузятся в studio, вот и исключить IAR EW...
   
RU Balancer #25.01.2012 11:58  @arkhnchul#25.01.2012 11:49
+
-
edit
 

Balancer

администратор
★★★★★
arkhnchul> офф "код загромождает, не буду так делать" - ну вот поэтому у нас теперь для каждой ерунды типа ворда надо "два ядра и два гига"...

Неэффективный работающий код лучше эффективного не работающего или совсем отсутствующего.

Возьми и напиши свой Ворд, работающий на 3,5МГц и 32кбайт памяти. Тебе кто-то запрещает?
   
RU arkhnchul #25.01.2012 12:38  @Balancer#25.01.2012 11:58
+
-
edit
 

arkhnchul

втянувшийся

Balancer>Неэффективный работающий код лучше эффективного не работающего или совсем отсутствующего.

это да. Но ведь даже такие элементарные оптимизации, которые при понимании что там к чему выходят уже на автомате, ускоряют код существенно. Пример с предыдущей страницы - в 6 раз. Не делать их просто потому, что "не хочу лишнюю строку кода" - как-то уж слишком.

Balancer> Возьми и напиши свой Ворд, работающий на 3,5МГц и 32кбайт памяти. Тебе кто-то запрещает?

на таких ресурсах не взлетит. Насчет "сперва добейся"... не помним, на каких процессорах и объемах памяти тот же ворд внятно работал во время оно? За исключением свистоперделок странного интерфейса, там мало что изменилось.
   9.0.19.0.1
RU Balancer #25.01.2012 12:40  @arkhnchul#25.01.2012 12:38
+
-
edit
 

Balancer

администратор
★★★★★
arkhnchul> Пример с предыдущей страницы - в 6 раз. Не делать их просто потому, что "не хочу лишнюю строку кода" - как-то уж слишком.

Ну, например, для этого нужно знать :)

arkhnchul> не помним, на каких процессорах и объемах памяти тот же ворд внятно работал во время оно? За исключением свистоперделок странного интерфейса, там мало что изменилось.

Ну так пользуйся старым :)
   
RU arkhnchul #25.01.2012 13:16  @Balancer#25.01.2012 12:40
+
-
edit
 

arkhnchul

втянувшийся

Balancer> Ну, например, для этого нужно знать :)

та блин, даже простейшее правило - "если результат, возвращаемый функцией, используется более одного раза, его следует записать в переменную и работать уже с ней" - часто дает заметный (в числодробилках с массивами на стопицот элементов - существенный) прирост. Ко всяким getSize() в циклах это относится в первую очередь...
   9.0.19.0.1
US Сергей-4030 #25.01.2012 16:53  @arkhnchul#25.01.2012 13:16
+
+1
-
edit
 

Сергей-4030

исключающий третье
★★
arkhnchul> Ко всяким getSize() в циклах это относится в первую очередь...

Эти штуки все компиляторы давно умеют оптимизировать.
   16.0.912.7516.0.912.75
RU GOGI #25.01.2012 21:39  @Сергей-4030#25.01.2012 16:53
+
-
edit
 
Сергей-4030> Эти штуки все компиляторы давно умеют оптимизировать.
Ну ведь в For не оптимизирует. Хотя я вот этого не знал, думал что задавая именно такой цикл а не while ты указываешь, что границы нужно только вначале получить.
Ну и заодно специалисты скажите мне, почему
TestArray = TestClass.TestArray создает ссылку на TestClass.TestArray а не новый массив? Как это вообще определяется?
   8.0.18.0.1
US Сергей-4030 #25.01.2012 22:23  @GOGI#25.01.2012 21:39
+
-
edit
 

Сергей-4030

исключающий третье
★★
Сергей-4030>> Эти штуки все компиляторы давно умеют оптимизировать.
GOGI> Ну ведь в For не оптимизирует. Хотя я вот этого не знал, думал что задавая именно такой цикл а не while ты указываешь, что границы нужно только вначале получить.

Да. Не знаю, почему. Какие-то у него есть соображения, надо думать. В частности, если у тебя getSize() выдает не просто переменную, а сложные вычисления - тут особо не пооптимизируешь.

GOGI> Ну и заодно специалисты скажите мне, почему
GOGI> TestArray = TestClass.TestArray создает ссылку на TestClass.TestArray а не новый массив? Как это вообще определяется?

Есть много языков, в которых объекты всегда передаются по ссылке. В частности, Java.

String a = "aaa";
String b = a;
// Теперь a и b обе указывают на один и тот же участок памяти, где сидит "aaa"





String a = "aaa";
String b = new String(a);
// Теперь a и b обе указывают на разные участки памяти, в обеих сидит "aaa"


Заметь, что "примитивные" типы (int, double etc) копируются "по значению".
   16.0.912.7516.0.912.75
US Сергей-4030 #25.01.2012 22:25  @Сергей-4030#25.01.2012 22:23
+
-
edit
 

Сергей-4030

исключающий третье
★★
2 GOGI: тебе, наверное, лучше всего expose этот член класса (большой массив) и на него ссылаться. А еше лучше все-таки его инкапсулировать и дать методы доступа уровнем повыше (типа randomInitialize, searchFor etc)
   16.0.912.7516.0.912.75
RU Balancer #25.01.2012 23:56  @Сергей-4030#25.01.2012 16:53
+
-
edit
 

Balancer

администратор
★★★★★
arkhnchul>> Ко всяким getSize() в циклах это относится в первую очередь...
Сергей-4030> Эти штуки все компиляторы давно умеют оптимизировать.

А как компилятор узнает, что getSize() — не меняет состояние при вызовах? Это вам не академические ФП, типа Хаскаля :)
   
US Сергей-4030 #26.01.2012 00:17  @Balancer#25.01.2012 23:56
+
-
edit
 

Сергей-4030

исключающий третье
★★
arkhnchul>>> Ко всяким getSize() в циклах это относится в первую очередь...
Сергей-4030>> Эти штуки все компиляторы давно умеют оптимизировать.
Balancer> А как компилятор узнает, что getSize() — не меняет состояние при вызовах? Это вам не академические ФП, типа Хаскаля :)

Если компилятор видит, что getSize() это { return _size; } - то знает, правильно? Вот если getSize() это что-то сложное - вот тогда да.
   16.0.912.7516.0.912.75
RU Balancer #26.01.2012 00:20  @Сергей-4030#26.01.2012 00:17
+
-
edit
 

Balancer

администратор
★★★★★
Сергей-4030> Если компилятор видит, что getSize() это { return _size; } - то знает, правильно?

Если компилятор в поле видимости увидит такое, он вообще функцию не будет вызывать, прописав прямое обращение к параметру. Но стоит методу уйти хотя бы в соседний класс в соседнем файле — всё, облом.
   
US Сергей-4030 #26.01.2012 00:27  @Balancer#26.01.2012 00:20
+
-
edit
 

Сергей-4030

исключающий третье
★★
Balancer>Но стоит методу уйти хотя бы в соседний класс в соседнем файле — всё, облом.

Конечно.
   16.0.912.7516.0.912.75
RU arkhnchul #26.01.2012 00:38  @Сергей-4030#25.01.2012 16:53
+
-
edit
 

arkhnchul

втянувшийся

arkhnchul>> Ко всяким getSize() в циклах это относится в первую очередь...
Сергей-4030> Эти штуки все компиляторы давно умеют оптимизировать.
Сергей-4030>Если компилятор видит, что getSize() это { return _size; } - то знает, правильно? Вот если getSize() это что-то сложное - вот тогда да.

тут какбе... пример от балды:
code text
  1. for(int i=0;i<vector.size(); i++)
  2.     if(i%5==0)
  3.         vector.remove(i);

компилятору такие случаи как оптимизировать? При этом метод size() нам, допустим, доступен в исходниках и делает именно return _size;.
   9.0.19.0.1
+
-
edit
 

arkhnchul

втянувшийся

GOGI> Ну ведь в For не оптимизирует. Хотя я вот этого не знал, думал что задавая именно такой цикл а не while ты указываешь, что границы нужно только вначале получить.

Просто форма записи здесь такая неочевидная. В различных сях, явах и прочих синтаксисом похожих языках оно лучше видно, что к чему - for(инициализация;условие продолжения;действие после прохода тела цикла)
   9.0.19.0.1

tarasv

аксакал

GOGI> Ну ведь в For не оптимизирует. Хотя я вот этого не знал, думал что задавая именно такой цикл а не while ты указываешь, что границы нужно только вначале получить.

Такого смыла у for нет и быть не может т.к. VB не запрешает изменять как переменную цикла так и условие его окончания внутри тела цикла.
code text
  1.     Dim count As Integer = TestClass.testarray.GetUpperBound(0)
  2.     For i = 0 To count
  3.         TestArray1(i) = Rnd()
  4.         count = count - 1
  5.     Next

вполне законный кусок кода и поэтому если после To стоит вызов функции то она будет вызываться в каждой итерации. Кстати Сергей не совсем прав - такой For компилятор с большой вероятностью не соптимизирует даже если функция возвращает константу.

GOGI> TestArray = TestClass.TestArray создает ссылку на TestClass.TestArray а не новый массив? Как это вообще определяется?

Потому что в VB массив это объект типа Array, а объект передается по ссылке. Для создания массива сушествует укороченный синтаксис с круглыми скобками вместо создания его с помошью оператора new. Тоесть TestArray(size) As Type, если не в даваться в детали реализации, это укороченная запись для TestArray = New Array(Type, size). А если бы объект копировался, то код бы просто не работал, значения элементов массива TestArray в классе Test после прохода цикла оставался бы нулями.
   3.6.253.6.25
RU Balancer #26.01.2012 01:15  @arkhnchul#26.01.2012 00:38
+
+1
-
edit
 

Balancer

администратор
★★★★★
arkhnchul> компилятору такие случаи как оптимизировать? При этом метод size() нам, допустим, доступен в исходниках и делает именно return _size;

Не поленился слепить такой тест (гы, со времён Производительность языков. Объектный Фибоначчи :) даже тестов на Си++ не писал) на скорую руку:
code cpp
  1. #include <iostream>
  2. using namespace std;
  3.  
  4. class Vector
  5. {
  6.   private:
  7.     int _size;
  8.     int *_ptr;
  9.  
  10.   public:
  11.     Vector() { _size = 0; }
  12.     int size() { return _size; }
  13.  
  14.     void append(int n)
  15.     {
  16.         int *tmp = new int[_size+1];
  17.         for(int p=0; p<_size; p++)
  18.             tmp[p] = _ptr[p];
  19.  
  20.         _ptr = tmp;
  21.         _ptr[_size] = n;
  22.         _size++;
  23.     }
  24.  
  25.     void remove(int pos)
  26.     {
  27.         for(int p=pos; p<_size-1; p++)
  28.             _ptr[p] = _ptr[p+1];
  29.  
  30.         _size--;
  31.     }
  32.  
  33.     void print()
  34.     {
  35.         for(int p=0; p<_size; p++)
  36.             cout << _ptr[p] << endl;
  37.     }
  38. };
  39.  
  40. int main()
  41. {
  42.     Vector *vector = new Vector();
  43.     for(int i=0; i<20; i++)
  44.         vector->append(i);
  45.  
  46.     for(int i=0; i<vector->size(); i++)
  47.         if(i%5==0)
  48.             vector->remove(i);
  49.  
  50.     vector->print();
  51.     return 0;
  52. }


Так g++ при его компиляции вообще ни одной функции не сделал. Не то, что класса. В ассемблерном листинге просто линейная программа с циклами. Функции — только внешние cout.
   
RU arkhnchul #26.01.2012 01:26  @Balancer#26.01.2012 01:15
+
-
edit
 

arkhnchul

втянувшийся

однакож) не ожидал, чеснговоря, чтобы плюсовые компиляторы такое умели. А если подключить vector из STL?
   9.0.19.0.1
RU Balancer #26.01.2012 01:28  @arkhnchul#26.01.2012 01:26
+
+1
-
edit
 

Balancer

администратор
★★★★★
arkhnchul> однакож) не ожидал, чеснговоря, чтобы плюсовые компиляторы такое умели.

Боюсь, что они такое лет 15 умеют :) Или даже чуть больше. Впервые я восторгаться уровнем оптимизации стал где-то во времена Watcom 10 и MSVC4. А писал я тогда на Си++ очень много и довольно качественно ;) Я с Си/Си++ только в конце 1990-х слез. До этого — основной язык был.

arkhnchul> А если подключить vector из STL?

Скорее всего будут вызовы внешних функций. Оно же инкапсулировано.
   
RU arkhnchul #26.01.2012 01:47  @Balancer#26.01.2012 01:28
+
-
edit
 

arkhnchul

втянувшийся

Balancer> Боюсь, что они такое лет 15 умеют :)
отоночо... Плюсы как-то максимум щупал "на поглядеть", в основном из компилируемых си ковырял. Представлял себе, что там, раз уж существуют классы, они и должны представляться достаточно обособленными вещами в себе, без такого самодурства)) Попробовать, что ли, пару числодробилок вместо си на плюсовых классах нарисовать и посмотреть, что будет?

arkhnchul>> А если подключить vector из STL?
Balancer> Скорее всего будут вызовы внешних функций. Оно же инкапсулировано.
в смысле, если не просто дать ему #include <vector> со скомпилированной библиотекой, а сами исходники стдлиба.
   9.0.19.0.1
RU Balancer #26.01.2012 02:03  @arkhnchul#26.01.2012 01:47
+
-
edit
 

Balancer

администратор
★★★★★
arkhnchul> в смысле, если не просто дать ему #include со скомпилированной библиотекой, а сами исходники стдлиба.

Тоже, наверное, нет. Сорцы же по отдельности компилируются. И линкуются уже компилированные куски. Так что вся инлайновая оптимизация — внутри одного сорца.
   
1 2 3 4 5

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru