Нужен совет по выбору книги (C++)

tz-lom

Продвинутый новичок
dr-sm
я что,обязательно в пример должен был засунуть вместо Integer сложный класс и поставить комментарий что нам нужно отфильтровать значения из массива а не прореженную копию сделать?
Krishna
данный код вызывает рефлексию при преобразовании в toArray , почему её можно подавить языковыми средствами но это не делает компилятор ?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
холиворчег ничего вышел)
 

Krishna

Продался Java
1) где код "вызывает рефлексию" лично мне непонятно
2) Я так и не увидел где там "дикомедленно", как и вообще каких либо замеров производительности и сравнений с "дикобыстро"
3) Если заняться оптимизацией на спичках, то на, помедитируй над этим вот:

PHP:
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;

/**
 * 
 */

/**
 * @author kkrushn
 * 
 */
public class Test {

    final static int LIST_SIZE = 100500; // стопиццот!!!11
    
    public static void main(String[] args) {
        long time1 = new Date().getTime();
        List<Integer> list = m1();
        long time2 = new Date().getTime();
/*        for (Integer i : list)
            System.out.println(i);
*/        System.out.println("m1 Done in " + (time2 - time1) + " ms.");

        time1 = new Date().getTime();
        List<Integer> list2 = m2();
        time2 = new Date().getTime();
/*        for (Integer i : list2)
            System.out.println(i);
*/        System.out.println("m2 Done in " + (time2 - time1) + " ms.");
        
        time1 = new Date().getTime();
        List<Integer> list3 = m3();
        time2 = new Date().getTime();
/*        for (Integer i : list3)
    System.out.println(i);
*/        System.out.println("m3 Done in " + (time2 - time1) + " ms.");



    }
    
    public static List<Integer> m1() {
        List<Integer> list = new ArrayList<Integer>(LIST_SIZE);

        for(Integer i = 0; i < LIST_SIZE; i++)
        {
            list.add(i);
        }
        
        for (Integer x : list.toArray(new Integer[0])) {
            if ((Integer) x >= LIST_SIZE / 2 ) {
                list.remove(x);
            }
        }
        return list;
    }

    public static List<Integer> m2() {
        List<Integer> list = new ArrayList<Integer>(LIST_SIZE);

        for(Integer i = 0; i < LIST_SIZE; i++)
        {
            list.add(i);
        }
        
        
        Integer x = null;
        for (Iterator<Integer> ii = list.iterator(); ii.hasNext(); ) {
            x = ii.next();
            if (x >= LIST_SIZE / 2) {
                ii.remove();
            }
        }
        return list;
    }
    
    
    public static List<Integer> m3() {
        List<Integer> list = new LinkedList<Integer>();

        for(Integer i = 0; i < LIST_SIZE; i++)
        {
            list.add(i);
        }
        
        Integer x = null;
        for (Iterator<Integer> ii = list.iterator(); ii.hasNext(); ) {
            x = ii.next();
            if (x >= LIST_SIZE / 2) {
                ii.remove();
            }
        }
        return list;
    }
   
}
m1 Done in 34312 ms. (34 сек)
m2 Done in 1219 ms. (1.2 сек ...)
m3 Done in 78 ms. (0.08 сек .....)
 

dr-sm

Новичок
dr-sm
я что,обязательно в пример должен был засунуть вместо Integer сложный класс и поставить комментарий что нам нужно отфильтровать значения из массива а не прореженную копию сделать?
ну как cказать :D

Код:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test {

    public static class MegaClass {
        public final int id;
        public final String name;
        public MegaClass(int id) {
            this.id = id;
            this.name = "my name is " + id;
        }
    }

    private static boolean isRetained(final MegaClass o, final int qq) {
        return (o.id % qq) == 0;
    }

    private static List<MegaClass> getList(int size) {
        List<MegaClass> rs = new ArrayList<MegaClass>();
        for (int i = 0; i < size; ++i) {
            rs.add(new MegaClass(i));
        }
        return rs;
    }

    private static List<MegaClass> filterOne(List<MegaClass> list, final int qq) {
        for (MegaClass mc: list.toArray(new MegaClass[] {})) {
            if (!isRetained(mc, qq)) {
                list.remove(mc);
            }
        }
        return list;
    }

    private static List<MegaClass> filterTwo(List<MegaClass> list, final int qq) {
        for (Iterator<MegaClass> i = list.iterator(); i.hasNext();) {
            if (!isRetained(i.next(), qq)) {
                i.remove();
            }
        }
        return list;
    }

    private static List<MegaClass> filterThree(List<MegaClass> list, final int qq) {
        List<MegaClass> rs = new ArrayList<MegaClass>();
        for (MegaClass mc: list) {
            if (isRetained(mc, qq)) {
                rs.add(mc);
            }
        }
        return rs;
    }

    public static void main(String[] args) {
        final int listSize = 100500;
        for (int qq = 1; qq < 5; ++qq) {
            System.out.println("qq = " + qq);

            long t = System.currentTimeMillis();
            List<MegaClass> dummy1 = filterOne(getList(listSize), qq);
            System.out.println("dt one: " + (System.currentTimeMillis() - t) + " ms " + dummy1.size());

            t = System.currentTimeMillis();
            List<MegaClass> dummy2 = filterTwo(getList(listSize), qq);
            System.out.println("dt two: " + (System.currentTimeMillis() - t) + " ms " + dummy2.size());

            t = System.currentTimeMillis();
            List<MegaClass> dummy3 = filterThree(getList(listSize), qq);
            System.out.println("dt three: " + (System.currentTimeMillis() - t) + " ms " + dummy3.size());
        }
    }

}
Код:
drsm@rain:~/work/tmp$ java -verbose:gc -Xms512M Test
qq = 1
dt one: 94 ms 100500
dt two: 39 ms 100500
dt three: 33 ms 100500
qq = 2
dt one: 2790 ms 50250
dt two: 1988 ms 50250
[GC 131072K->17312K(502464K), 0.0196200 secs]
dt three: 35 ms 50250
qq = 3
dt one: 3317 ms 33500
dt two: 2625 ms 33500
dt three: 14 ms 33500
qq = 4
dt one: 3539 ms 25125
[GC 148384K->9846K(502464K), 0.0114580 secs]
dt two: 2957 ms 25125
dt three: 13 ms 25125
 

tz-lom

Продвинутый новичок
ок,меня слили :(
показывать наличие рефлексии внутри toArray() (без параметров вызванного) лениво,бестолку, и что то она не вызывает тех просадок скорости которые мне показывали, может и правда впилили эту оптимизацию?
да и суппер-джависты юзают весьма спорные,но крайне эффективные приёмы ускорения кода (простите,но связанные списки и заполнение массива указателей это стремление переделать задачу на свой лад а не пример классного рефакторинга и уж никак не относится к проблеме "в toArray рефлексия не убираемая оптимизатором")

вот правда джава была "перспективным языком программирования,на котором будут писать все через пару лет" есть и будет (если не сольёт дотнету конечно,чего честно говоря не хотелось бы)

P.S.
по теме ТС - есть крайне интересная книжка "Дизайн и эволюция С++" Страуструпа (имхо название перевели неправильно,но так на обложке написано) С++ по ней не выучить ,да и не для этого она , но как книжка - интересная,об истории языка и всём таком
 

dr-sm

Новичок
ок,меня слили :(
показывать наличие рефлексии внутри toArray() (без параметров вызванного) лениво,бестолку, и что то она не вызывает тех просадок скорости которые мне показывали, может и правда впилили эту оптимизацию?
да и суппер-джависты юзают весьма спорные,но крайне эффективные приёмы ускорения кода (простите,но связанные списки и заполнение массива указателей это стремление переделать задачу на свой лад а не пример классного рефакторинга и уж никак не относится к проблеме "в toArray рефлексия не убираемая оптимизатором")
код который ты привел, тормозит по определению, там допущена алгоритмическая ошибка (если конечно у нас действительно тормоза именно там).
структуру данных ArrayList из указателей на объекты (в идеале, кусок последовательной памяти) эффективно отфильтровать можно только сделав копию.
public Object remove(int index)
Removes the element at the specified position in this list.
Shifts any subsequent elements to the left (subtracts one from their indices).
там речи быть не может об каком-то оверхеде дополнительном.
связанные списки, если жирный массив тоже не лучший выбор.

вот правда джава была "перспективным языком программирования,на котором будут писать все через пару лет" есть и будет (если не сольёт дотнету конечно,чего честно говоря не хотелось бы)
ларри говорит, что ява была самым ценным приобретением у сана.
P.S.
по теме ТС - есть крайне интересная книжка "Дизайн и эволюция С++" Страуструпа (имхо название перевели неправильно,но так на обложке написано) С++ по ней не выучить ,да и не для этого она , но как книжка - интересная,об истории языка и всём таком
+100500 :)
 

Sherman

Mephi
Моя версия.

C

Только синтаксис:
Керниган, Ричи. Язык C.

Всю идиоматику и реальное применение нужно будет постигать из исходного кода.

Неплохие примеры - всем известные open source проекты: linux kernel, apr, libevent и так далее.

С++.

Начальный:
Страуструп.

Средний(чтобы устроиться на работу).
Скотт Майерс. Эффективное использование С++.
Герб Саттер. Решение сложных задача на С++.
Стандарт.
STL, Boost, шаблоны.

Продвинутый(монстр).
Андрей Александреску. Современное проектирование на С++.
TMP, Boost(а как все внутри), Стандарт наизусть.

А вообще нафиг-нафиг с++. Времени надо много, работы интересной мало. На рынке нужны только очень хорошие с++ программисты, коими еще надо стать. Java и правда проще освоить.

p.s. Кстати все подобные тесты скорости java бред. А почему - хороший вопрос для собеседования ;-)
 
Сверху