@Ulysses вы ещё не всё перенесли, дочистите пожалуйста))
Не вижу ничего больше.
Ладно. Вот код:
begin
var n := 100000000;
var a := new integer[n];
var b: integer;
Milliseconds;
loop 10 do
for var i:=0 to a.Length-1 do
a[i] := i;
Print(MillisecondsDelta);
end.
У меня в режиме Release при запуске по Shift-F9 он работает 1000 мс. В режиме Debug 2500
Ускорьте его на C# с использованием fixed и указателей
Пожалуйста. Код:
using System;
namespace My{
public static class Program{
public static unsafe void Main(){
var arr = new int[100000000];
var DT = DateTime.Now;
for(int j = 0; j < 10; j++){
for(int i = 0; i < 100000000; i++){
arr[i] = i;
}
}
Console.WriteLine("Наивный метод: " + (DateTime.Now - DT).TotalMilliseconds.ToString());
DT = DateTime.Now;
fixed(int* a = arr){
for(int j = 0; j < 10; j++){
int* adr = a;
for(int i = 0; i < 100000000; i++){
*adr = i;
adr++;
}
}
}
Console.WriteLine("С использованием указателей: " + (DateTime.Now - DT).TotalMilliseconds.ToString());
Console.ReadLine();
}
}
}
Батник для вызова компилятора:
C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe -target:exe -optimize -unsafe -out:Test.exe "Test.cs"
cmd.exe
За форматирование кода прошу не ругать, форматировал вручную. У меня на индексатор уходит примерно 4000 мсек, а на указатели - 2500 мсек.
А Вы откомпилируйте и exe-шку запустите. У меня 3250 мсек на Паскаль, 4000 мсек на C# (наивный) и 2300 мсек на нативный. У меня вот при свободном компьютере такой резалт:
Кх - кх.
Может есть резон закрыть 120 вкладок браузера? C# быстрее, но ненамного.
Значит. Но в Паскале этого волшебного ‘-optimize’ я не нашёл.
Я так и сделал (студия ваш код в принципе не принимает, говорит для unsafe
надо /unsafe
).
В вашем батнике используется устаревший компилятор C# (оно пишет об этом при компиляции)
+ там в настройках стоит оптимизировать unsafe
, не значит ли это что безопасный будет медленнее? Просто меня удивляет что на C# программа работает на ~20% медлинее чем на паскале.
У меня нет студии.
Вряд ли это что-то меняет.
Ещё раз повторяю, я именно так и сделал. И получил результаты пропорциональные вашим, только раза в 1.5 быстрее (все 3 замера).
Нет никаких 120! Только 106 .
Ну а если серьёзно - это одинаково повлияло бы на все результаты. А считая что оперативки хватает и процессорного времени почти не жрёт - влияние вообще не должен зависеть от этого.
Но вы только что сказали
Это же оба наивные методы, правильно? Почему C# в абсалютно равных условиях вдруг проиграл на 25-30%. И у меня так же при чём. Вот я и думаю, дело в том какой компилятор/режим компилятора использовался.
А Вы что для компиляции использовали?
Программу которую вы дали + батник который вы дали.
Ещё раз повторил. Результаты:
- Паскаль. Наивный метод: 3034 msec
- C#. Наивный метод: 2972 msec
- C#. Указатели: 2198 msec
Будем гадать на кофейной гуще…
- Паскаль. Наивный метод: 2000-2050 msec
- C#. Наивный метод: 2000-2050 msec
- C#. Указатели: 1580-1620 msec
Действительно, надо было просто несколько раз запустить… В общем да, теперь всё на своих местах.
Улыбнулся.
Да. Был симпатичный коротенький и наглядный код на Паскале. Стоило городить “три километра в гору пешком мимо Гитлера” (с), чтобы получить невнятный (навскидку) код и выгадать 25% производительности?
Кто что где нагородил?
“Арабская вязь” сишных кодов, испещренных указателями, у меня по жизни раздражитель ))) Я в свое время навсегда наелся этой адресацией в ассемблерах.
Это не касается готового кода на паскаля, это лишь проверка, которую попросил @admin. Вы знаете как устроить эту проверку красивее? Кроме того, часть про указатели это только 9 строчек.
20% - это небольшой выигрыш ради того чтобы сделать работу сборщика мусора неэффективной и замедлить остальные части приложения.
В PascalABC.NET есть много других мест, которые можно оптимизировать сильнее
Если бы это действительно было лишено смысла, то этим бы никто не пользовался. В каждой статье, посвящённой оптимизации приложений под .NET, затрагивается тема указателей. Если считать, что 20% - это мало, то не надо удивляться тому, что на Паскале программы работают медленнее, причём намного. 20% - это везде 20%. Если такое отношение к оптимизации, то я не думаю, что Паскаль сможет продвинуться дальше, чем школьный курс информатики, где быстродействия Питона хватает за глаза.