Директива компилятора для отключения проверки индексатора массива


#35

Пожалуйста. Код:

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 мсек.


#36

То что на паскале - это ваша программа, запускал на Shift+F9 отключив отладочную информацию.


#37

А Вы откомпилируйте и exe-шку запустите. У меня 3250 мсек на Паскаль, 4000 мсек на C# (наивный) и 2300 мсек на нативный. У меня вот при свободном компьютере такой резалт:

Кх - кх.

Может есть резон закрыть 120 вкладок браузера? C# быстрее, но ненамного.

Значит. Но в Паскале этого волшебного ‘-optimize’ я не нашёл.


#38

Я так и сделал (студия ваш код в принципе не принимает, говорит для unsafe надо /unsafe).

В вашем батнике используется устаревший компилятор C# (оно пишет об этом при компиляции)

+ там в настройках стоит оптимизировать unsafe, не значит ли это что безопасный будет медленнее? Просто меня удивляет что на C# программа работает на ~20% медлинее чем на паскале.


#39

У меня нет студии.

Вряд ли это что-то меняет.


#40

Ещё раз повторяю, я именно так и сделал. И получил результаты пропорциональные вашим, только раза в 1.5 быстрее (все 3 замера).

Нет никаких 120! Только 106 :wink:.
Ну а если серьёзно - это одинаково повлияло бы на все результаты. А считая что оперативки хватает и процессорного времени почти не жрёт - влияние вообще не должен зависеть от этого.

Но вы только что сказали

Это же оба наивные методы, правильно? Почему C# в абсалютно равных условиях вдруг проиграл на 25-30%. И у меня так же при чём. Вот я и думаю, дело в том какой компилятор/режим компилятора использовался.


#41

А Вы что для компиляции использовали?


#42

Программу которую вы дали + батник который вы дали.


#43

Ещё раз повторил. Результаты:

  • Паскаль. Наивный метод: 3034 msec
  • C#. Наивный метод: 2972 msec
  • C#. Указатели: 2198 msec

Будем гадать на кофейной гуще…


#44
  • Паскаль. Наивный метод: 2000-2050 msec
  • C#. Наивный метод: 2000-2050 msec
  • C#. Указатели: 1580-1620 msec

Действительно, надо было просто несколько раз запустить… В общем да, теперь всё на своих местах.


#45

Улыбнулся. :smile:


#46

Да. Был симпатичный коротенький и наглядный код на Паскале. Стоило городить “три километра в гору пешком мимо Гитлера” (с), чтобы получить невнятный (навскидку) код и выгадать 25% производительности?


#47

Кто что где нагородил?


#48

“Арабская вязь” сишных кодов, испещренных указателями, у меня по жизни раздражитель ))) Я в свое время навсегда наелся этой адресацией в ассемблерах.


#49

Это не касается готового кода на паскаля, это лишь проверка, которую попросил @admin. Вы знаете как устроить эту проверку красивее? Кроме того, часть про указатели это только 9 строчек.


#50

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

В PascalABC.NET есть много других мест, которые можно оптимизировать сильнее


#51

Если бы это действительно было лишено смысла, то этим бы никто не пользовался. В каждой статье, посвящённой оптимизации приложений под .NET, затрагивается тема указателей. Если считать, что 20% - это мало, то не надо удивляться тому, что на Паскале программы работают медленнее, причём намного. 20% - это везде 20%. Если такое отношение к оптимизации, то я не думаю, что Паскаль сможет продвинуться дальше, чем школьный курс информатики, где быстродействия Питона хватает за глаза.


#52

Так вроде уже нишу определили, как 90-95% обучение. И не только школьная информатика, первокурсники вузов тоже. А Вы все в том же стиле продолжаете: “Паскаль удобный, но надо, чтобы на нем писать, как на С/С++, ну на С# в худшем случае”. Когда уж Вы поймете, что никто не будет переделывать язык под такие хотелки? :grinning:


#53

Я не предлагаю писать как на C/C++, я предлагаю оптимизировать язык. Чтобы при паскалевском синтаксисе получить эффективность как на C#. Хватит уже оглядывается на устаревшие реализации языка.


#54

Меня абсолютно не устраивает C/C++, а к C# есть некоторые замечания. Но согласитесь, что во всех этих языках есть сильные стороны. В C/C++ за счёт убогого синтаксиса достигается невиданная производительность, а C# имеет более красивый синтаксис, очень напоминающий паскалевский, что несколько замедляет код, но также позволяет серьёзно оптимизировать, но с минимальными извращениями. В Питоне есть несколько очень гибких конструкций, которые за счёт реализации работают очень долго, но разработчикам Паскаля удалось добавить их в свой язык и существенно ускорить. Пытаться отстоять здесь совместимость с допотопными паскалями, по моему, просто глупо. Эта возможность попросту мало кому нужна, а кому это всё же надо, сможет подогнать свой код по абц, без этого по-любому не обойдётся.