0 голосов
спросил от в категории CJava
Я попробовал (на моем Lubuntu Box) следующие программы:
import java.util.*; class Primes {   static java.util.ArrayList<Integer> primos;   static boolean comprobarPrimacidad(int n)   {     Iterator<Integer> it = primos.iterator();     boolean primo = true;     do     {           if((n%it.next()) == 0) primo = false;     } while((primo == true) && (it.hasNext()));     if(primo) primos.add(n);     return primo;   }   public static void main( String [] args)   {     primos = new java.util.ArrayList<Integer>();     int n=2;     primos.add(n);     while ( primos.size() < 50000)     {       ++n;       comprobarPrimacidad(n);     }   } }


1 ## #

со следующим временем выполнения:
Java     0m8.573s C++      0m25.919s C++ -O3   0m4.416s



Оптимизация компилятора ( -O3 для g ++ ), по-видимому, играет важную роль.

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
0 голосов
ответил от
Такое огромное различие в производительности может быть связано только с серьезным узким местом производительности в версии на C ++. Это, скорее всего, связано с накоплением распределений памяти, так как массив растет до 50 000 единиц за один раз. В версии C # этот объем памяти будет предварительно выделен как управляемая куча. Вы также можете предварительно выделить вектор на C ++, и вы должны сделать это, если знаете, что он, вероятно, будет настолько большим.

Не используйте push_back () , чтобы увеличить вектор до 50 000! Вы вынуждаете его запускать алгоритм распределения памяти каждый раз, когда вы добавляете элемент. Представьте вектор или инициализируйте его, чтобы вырасти в приличных кусках, скажем, 500 элементов за раз, а затем посмотрите, какой результат вы получите.
0 голосов
ответил от
Вы сравниваете яблоки с апельсинами. Во-первых, код, который вы написали, чтобы найти простые числа, наивно неэффективен. Вы не принимаете во внимание то, что происходит за кулисами на любом языке, и вы на самом деле играете на слабые стороны обоих языков.

Реализация, которую я написал в VB.NET будет генерировать 6 миллионов простых чисел менее чем за 2 секунды на 5-летнем оборудовании. Это не языки, которые вы использовали, но код, который вы написали, является проблемой.

Категории

Добро пожаловать на сайт DraftingCode Q&A (ИТ ответы), где вы можете задавать вопросы и получать ответы от других членов сообщества.

Похожие вопросы

0 голосов
0 ответов
спросил 08 Май от originalgriff в категории CJava
0 голосов
0 ответов
0 голосов
0 ответов
0 голосов
0 ответов
спросил 23 Март от ppolymorphe в категории CJava
0 голосов
0 ответов
спросил 24 Март от karstenk в категории CJava
...