1. Java / Говнокод #5335

    +75

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    public static Cursor getListGroupCursor(Activity activity,
    			ShopListItem list, boolean marked) {
    		long state = marked ? Cells.PURCHAZED_STATE : Cells.WANT_TO_BUY_STATE;
    		String where;
    		String[] arg;
    		if (list.isAutoList()) {
    			where = Cells.STATE + " = ?";
    			arg = new String[] { Long.toString(state) };
    		} else {
    			where = Cells.LIST_ID + " = ? AND " + Cells.STATE + " = ?";
    			arg = new String[] { Long.toString(list.getId()),
    					Long.toString(state) };
    		}
    
    		Cursor c = activity.managedQuery(Cells.CONTENT_URI,
    				new String[] { Cells.CATEGORY_ID }, where, arg,
    				Cells.DISTINCT_SORT_ORDER);
    
    		ArrayList<Long> ids = new ArrayList<Long>();
    		while (c != null && c.moveToNext()) {
    			ids.add(new Long(c.getLong(c.getColumnIndex(Cells.CATEGORY_ID))));
    		}
    		if (c != null) {
    			c.close();
    		}
    		int count = ids.size();
    		String whereGroup = null;
    		String[] argGroup = null;
    		if (count > 0) {
    			whereGroup = "";
    			argGroup = new String[count];
    			for (int i = 0; i < count; i++) {
    				if (i < count - 1) {
    					whereGroup += (Categories._ID + "= ? OR ");
    				} else {
    					whereGroup += (Categories._ID + "= ?");
    				}
    
    				argGroup[i] = Long.toString(ids.get(i));
    				// Log.i(tag, "getListGroupCursor "+argGroup[i]);
    			}
    		} else {
    			whereGroup = Categories._ID + "= -1";
    		}
    		Cursor groupCursor = activity.managedQuery(Categories.CONTENT_URI,
    				null, whereGroup, argGroup, Categories.DEFAULT_SORT_ORDER);
    		return groupCursor;
    	}

    Работа с ContentProvider в android. Выборка категорий, id которых присутствуют в результатах первой выборки (по признаку)

    Запостил: rphx, 19 Января 2011

    Комментарии (29) RSS

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

      меня тут уже давеча спрашивали типа как это может быть что на айфоне с его доисторическим процом все работает быстрее чем на андроиде с гигагерцовым процом...
      Ответить
      • для тех кому не лень обмазаться есть http://developer.android.com/sdk/ndk/index.html
        Ответить
        • ндя...

          выглядит что на самом деле андроид есть http://en.wikipedia.org/wiki/JavaOS

          и меня до сих пор бесит что эти чудаки в Жабе так и не сделали `delete`. блин даже в пыхе есть unset. я понимаю что у меня это легкая параноя, но блин сколько памяти вот тот код кидает в GC - хотя там почти каждая временная переменная может быть немедленно удалена.

          ну да ничего. процы нынче дешевые. скоро сделают дуал коре ARM проц, проблема говно-языков сама собой рассосётся.
          Ответить
          • >и меня до сих пор бесит что эти чудаки в Жабе так и не сделали `delete`
            не совсем понял... если нужно удалить объект obj, то напишите obj = null; и тогда (при условию что больше ссылок на него нет) сборщик мусора поставит это объект в "расстрельный список" и уничтожит при первой возможности. Или в чем проблема?
            Ответить
            • как раз в том и проблема что вместо того что бы его просто уничтожить, он ставится в растрельный список. а потом рантайм еще будет долго думать а можно ли его уничтожить или нет. вместо того что бы просто уничтожить потому что программист сказал "да, его можно прям сейчас уничтожить."
              Ответить
              • >>программист сказал "да, его можно прям сейчас уничтожить."
                а в стеке соседнего потока осталась на него ссылка (извините, указатель). Что будет с указателем?
                Ответить
                • ничего. у jvm информация о ссылках уже есть (GC не с потолка информацию о ссылках берет) и она должна вместо удаления отдать указатель обычному GC.

                  типа как это и работает в других языках: в перле undef, в пыхе unset, в oбжси release/autorelease.
                  Ответить
                  • тоесть просто подтолкнуть GC к тому, что бы еще раз посмотреть на эту ссылку?
                    так это не delete ни разу)

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

                    и вот еще что: ГЦ бы работал постоянно
                    и программа вечно бы стояла раком
                    Ответить
                    • ну млин. кучи програм работают - и не стоят раком. так может выкинуть нахер тот GC? :))))) (сорри, не удержался)

                      > Для этого есть метод в Runtime, кстати.

                      ссылочку? у нас тут есть жабный сервачок с проблемкой. может поможет немного коллегам жабщикам. (хотя сомневаюсь, там все 3rd пати либами обложено.)
                      Ответить
                      • кучи программ работают на жабе и не стоят раком
                        может выкинуть нахер всё остальное?)

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

                        http://download.oracle.com/javase/6/docs/api/java/lang/System.html#gc()
                        Ответить
            • скорее при первой необходимости
              объект уничтожат только если кончица память ( по крайней мере сановские гц так работают)

              очень может быть что объект не уничтожат никогда
              Ответить
              • QED, сначала аппликация идлится, а как только юзер Вася решает зогрузить фотку с ласточкой - начинает чистить память
                Ответить
                • ну зачем же так пафосно.
                  во-первых есть разные гц с разными стратегиями, некоторые из них дрочать по чуть-чуть, другие -- ставят раком приложение раз в N часов на 10 секунд. Страдают от этого разве что игры, ну так не пишите на джаве игры) энтерпрайз не страдает, сайнс приложения тоже не страдают.

                  во вторых на современных железках эти менопаузы вообще не видны.

                  ну и наконец, раз уж мы играем в софистов, припомню слова миркософт про дотнет: "приложения на .NET работают быстрее нативных приложений потому что JITятся под конкретный процессор". Со времен хотспота в жабе некоторые кусочки тоже джитяцца)
                  Ответить
                  • > ну зачем же так пафосно
                    > играем в софистов
                    Вы описали принцип работы, я сделал вывод. Что же вам не нравится? Или не стоило воспринимать так буквально?
                    Ответить
                    • ну Вы так сказали, будто приложение зависает на три часа из за слишком большой картинки
                      я и сказал что это немного преувеличино
                      Ответить
          • >>и меня до сих пор бесит что эти чудаки в Жабе так и не сделали `delete`. блин даже в пыхе есть unset.

            мне кажется Вам стоит почитать про GC.
            delete не возможен впринципе в языках с автоматическим управлением памятью. Что будет с указателем, если объект удалили? аксесс виолейшен?))

            unset в пыхе не удаляет объект из кучи, он обнуляет переменную.

            Не стоит говорить вещи, не разобравшись. Звучит глупо. Все равно что сказать "меня бесит что в сях до сих пор нет рефлексии"
            Ответить
            • > unset в пыхе не удаляет объект из кучи, он обнуляет переменную.

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

              в перле, если ты делаешь переменной undef (аналог пыхого unset) и на переменную нет ссылок, то память даже до GC не доходит и моментально удаляется (валится в фрии пул). выход из контекста из-за производительности этого в общем случае не делает - там всех деталей я не знаю. а т.к. undef я сам не раз использовал (например перегонка тон данных из базы в базу) то знаю что помогает реально.

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

              у меня один перловый сетевой сервак работает уже 53 дня - а расход памяти все еще 7МБ. сколько транзакций обработал, счет уже потерян давно. ну прям магия. (преднамерено там undefы нигде не развешивал: там просто почти все локальные переменные.)
              Ответить
              • так)
                причем тут delete-то?

                <?php
                
                class Foo {
                	var $strName;
                }
                
                $foo = new Foo();
                $boo = &$foo;
                
                $foo->strName="pupkin";
                unset($foo);
                
                print $boo->strName; // выдаст pupkin, хотя foo уже нет.
                print $foo->strName; //выдаст ошибку потому что foo нету
                
                ?>


                в случае delete $boo указывало бы в кусок памяти, где уже ничего нет, и был бы эксепшен.


                теперь по второй части:
                Жаба (сановская) отжирает сразу же столько, сколько указано в -Xms (кажется так называется парметр) и растет до -Xmx. Дальше вылетает срабатывает GC. Хотя он может и раньше сработать (и его даже можно явно вызвать через Runtime, если знаете что лучше почистится сейчас).

                Что бы добится на жабе таких же эффектов, как на перловом серваке -- надо задать максимальный размер хипа (7 метров в жабе не получится конечно, но например 50 -- можно).

                Резюмирую:
                1) Ни Perl ни PHP ни Java не дают ЯВНО удалить объект из памяти, если на него все еще есть ссылки. delete нету ни в одном из этих языков.
                2) Java запускает GC не постоянно, а когда у нее кончается память потому, что это -- тяжелая операция, зачем делать ее "просто так"?
                3) В жабе можно явно вызвать GC через Runtime.
                4) Реализация delete (явного удаления объекта из памяти внезависимости от ссылок) физически невозможна в языках с автоматическим управлением памятью. Если ОЧЕНЬ хочется -- есть WeakReference. Это прокси класс. GC заколлектит лежащий в нем объект, а WeakReference превратится в null.
                Ответить
    • java -- сплошной говнокод
      Ответить
    • какой-то пидарский код, в независимости от андроида
      такое ощущение, что его писали или в 97м году под java 1.1 или человек два дня как перелез на жабу с пхп.

      во-первых что случилось с итерациями?
      во-вторых зачем =null?
      в-третьих зачем new Long, когда есть автобоксинг?
      в четвертых что за пхпобразный кверибилдер?

      короче не джава-стайл совершенно
      Ответить

    Добавить комментарий