LINUX.ORG.RU

оптимизировать код

 


0

1
for (X x1: A)
    for (X x2: A)
    ...
        for (X xN: A)
            func(x1, x2... xN);

как оптимизировать вышепредложенный код на java, чтобы не городить N циклов for? реквестирую более изящное решение

★★★★★
Ответ на: комментарий от vurdalak

неочевидно?

если про суть - юнит-тесты, тестирую метод на полном диапазоне значений

jcd ★★★★★
() автор топика
Ответ на: комментарий от jcd

Ну можно рекурсией запилить. Цикл в метод, передавать в него начальные данные плюс список x1..xN из стека вызовов.

vurdalak ★★★★★
()

Возьми какой-нибудь клон QuickCheck для java.

zz ★★★★
()
Ответ на: комментарий от jcd

А вообще странный тест какой-то. Ты уверен, что тебе весь диапазон нужен? По идее достаточно проверить конечные, начальные и прочие граничные значения, где ты предполагаешь появление проблем в будущих изменениях.

vurdalak ★★★★★
()

Fors.for3(myCollection,(x1,x2,x3) -> /* шота */);

функции forN сгенерить руками, для N от 1 до 255.

stevejobs ★★★★☆
()

Перепилить функцию или разбить на несколько поменьше.
Кода аргументов >3 уже стоит задуматься.

anonymous
()
Ответ на: комментарий от anonymous

никак, а зачем оптимизировать юнит тест?

+

Если тебе надо А*А*А вызовов, тебе придется сделать А*А*А вызовов.

yoghurt ★★★★★
()
Ответ на: комментарий от slyjoeh

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

xaizek ★★★★★
()
Ответ на: комментарий от yoghurt

A*...*A вызовов не изменятся, изменится убогонький стиль их написания. прикручиваю for в рекурсивном методе, выглядит вроде как получше

jcd ★★★★★
() автор топика
Ответ на: комментарий от jcd

изменится убогонький стиль их написания

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

yoghurt ★★★★★
()
Ответ на: комментарий от jcd

в жабе нет макросов

public static void main(String[] args) {
     String code = 
         "for (X x1: A)"+
             "for (X x2: A)"+
              ...
                 "for (X xN: A)"+
                     "func(x1, x2... xN);";
     Files.write(Paths.get("./target/gen-src/fors.java"), code.getBytes());
}
stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

и да, у Maven есть фаза generate-sources. На которой кроме собственно создания сорцов можно запустить и maven-compile-plugin. Если не хватит этого (например, надо как-то хитро подчищать за собой), можно там же запустить groovy plugin или ant plugin, и там сотворить любую магию. Так что можно сравнительно просто генерить произвольное количество говна, любого сорта и в любом месте.

stevejobs ★★★★☆
()
Ответ на: комментарий от stevejobs

Гм, так и весь проект можно писать на нормальном языке (С++ с макросами), который потом генерирует нормальный Java-код! Как я раньше не догадался.

mono ★★★★★
()
Ответ на: комментарий от GblGbl

Примерно так: n - количество тестов.

нет, нужен гарантированный обход всего диапазона

jcd ★★★★★
() автор топика
Ответ на: комментарий от jcd

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

stevejobs ★★★★☆
()
Ответ на: комментарий от mono

так и весь проект можно писать на нормальном языке (С++ с макросами)

мне кажется, ты в этой фразе оговорился как минимум дважды

jcd ★★★★★
() автор топика
Последнее исправление: jcd (всего исправлений: 1)
Ответ на: комментарий от stevejobs

Лучше тогда gradle взять, там такие вещи намного более органично делаются.

Если закрыть глаза на то что gradle тормоз и глюкалово (во всяком случае, в android-варианте).

mono ★★★★★
()

если там что-то типа

void func(X... args)
и число аргументов N может быть любым, то переписать рекурсивно (ограничив глубину до требуемой).
Иначе не вижу смысла, вместо оптимизации только стек теребить

TheAnonymous ★★★★★
()
Ответ на: комментарий от mono

верхний пост с 133 лайками

http://stackoverflow.com/questions/16775197/building-and-running-app-via-grad...

больше всего помогает org.gradle.daemon=true, и покупка SSD и процессора i7

но мне почему-то мавен больше нравится, например если надо будет писать тулзу для анализа билд-файлов, для мавена это гораздо проще

stevejobs ★★★★☆
()

юнит-тесты, тестирую метод на полном диапазоне значений

Цитирую Боба Мартина: «Тесты должны выполняться быстро, не более десяти минут на запуск и прохождение».

Короче говоря, с твоими тестами что-то не так.

LongLiveUbuntu ★★★★★
()

Можно использовать потоки. Генерация потока комбинаций из N значений будет отдельно, мэп потоку отдельно. Выглядеть должно красивее.

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

anonymous
()
Ответ на: комментарий от stevejobs

больше всего помогает org.gradle.daemon=true, и покупка SSD и процессора i7

Да вот да, знаю я это. Но всё равно ситуация удручающая. Раньше я мог очень легко работать на макбук эйре с 4 гигами, а теперь он кажется тормозным мамонтом из прошлого века.

mono ★★★★★
()
Ответ на: комментарий от anonymous

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

anonymous
()
Ответ на: комментарий от mono

Почему бы просто не купить новенький топовый макбук?

anonymous
()
Ответ на: комментарий от mono

он кажется тормозным мамонтом из прошлого века.

mono

В Вашей подписи есть ответ на Ваш риторический вопрос.

Пишу с Acer 5742G, на котором весьма шустро крутится GXT/Spring/Hibernate приложение.

Естественно, на нормальном enterpriZe языке программирования, а не на поделии от Мигеля Икасы.

Bioreactor ★★★★★
()
Ответ на: комментарий от Bioreactor

Я тоже пишу на нормальном enterpriZe языке программирования, потому что я уже около 5 лет ведроид-девелопер, а мой ник – это просто ник.

Про GXT/Spring/Hibernate ничего сказать не могу, но уверен, что gradle на Acer 5742G будет работать так же «быстро» как и на моём macbook air.

mono ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Тесты должны выполняться быстро, не более десяти минут на запуск и прохождение

Один тест, или все?

vurdalak ★★★★★
()

Делай вызов func два раза, что б наверняка.

anonymous
()
Ответ на: комментарий от reality_hacker

Челу нужны комбинации а не перестановки, твое решение не выдаст 1,1,1,1,1 например.

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

slyjoeh ★★★
()
Ответ на: комментарий от LongLiveUbuntu

И каким образом это достижимо, если кодовая база проекта непрерывно растёт? В проекте на пару гигов исходников тесты могут идти час.

vurdalak ★★★★★
()
Ответ на: комментарий от LongLiveUbuntu

Тогда все тесты в сумме будут больше 10 минут, о чём я и спрашивал. Неважно как запускать, всё равно запускать на каждом этапе нужно все тесты.

vurdalak ★★★★★
()
Ответ на: комментарий от Bioreactor

Что может нищеброд из убогой, дикой масквашки знать про enterprise? Такого лоха до компаний из ftse100 и близко не допустят.

anonymous
()
Ответ на: комментарий от mono

Нормально работает. i3-380M. 6GB RAM.

Я не трачу деньги на быстро устаревающие технологии.

У меня другие ценности - как здесь показано -

http://lowres.cartoonstock.com/music-wifi-hi_fi-record_player-vinyl-seven_inc...

(Кто из показанных на рисунке персонажей более счастлив?:))

Bioreactor ★★★★★
()
Последнее исправление: Bioreactor (всего исправлений: 1)

3 вложенных for

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

И да, за функции/методы с более, чем двумя, параметрами тоже сжигать надо - рефактори программу так, чтобы у тебя функции максимум два параметра имели (и никаких boolean-параметров! Один метод должен выполнять строго одно действие, а не представлять из себя лапшу с кучей ифов!). Выноси функционал в несколько различных методов.

cherry-pick
()
Ответ на: комментарий от cherry-pick

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

jcd ★★★★★
() автор топика
Ответ на: комментарий от barberry

Булевы параметры обычно юзают, чтобы превращать нормальные методы (или функции, если мы о C говорим, ЯП тут не важен, важен принцип) в нечто подобное:

Псевдокод:

void superCoolMethode(int num, bool param) {
  if (param) {
     someAction(num)
     …
     over 9000 lines
  } else {
      otherAction(num)
      …
      over 9000 lines
  }
}

То-есть, метод выполняет два различных действия, в зависимости от переданного boolean-параметра. А если этих булевых параметров два, то мы имеем 4 разных действия. А если три, то все 8. А это не дело - метод должен выполнять только одно действие.

cherry-pick
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.