Если кому интересно, в Julia таковая есть.
А Julia основана на .Net? Может от туда можно было бы решение взять, как они реализовали?
Нет, не .NET, а LLVM.
Паскаль - язык, задуманный для достаточно надежного программирования. У него строгая типизация, запрет на преобразования, которые могут повлечь потерю данных (например real -> integer) и т.п. И вдруг - отключение контроля границ массива! Мало проблем с арифметическими переполнениями в целочисленных, отсутствует контроль в диапазонных типах, так еще и это добавить? Ну и куда мы так придем?
Ну, контроль переполнения и т.п. в основном режиме компилятора отсутствует, а добавить предлагается в директиву, это всё же не одно и то же.
Да, можно выпустить модифицированный травматический пистолет со сменным механизмом и стволом, позволяющий опционально стрелять боевыми патронами. Но позволят ли?
Главное, чтобы не узнали
А КАК вы это делать собираетесь?
Через указатели. Если нет возможности пользоваться ими для этого явно, можно заставить делать это компилятор.
А что будете делать когда .NET переместит эту память в результате очередной сборки мусора?
Для этого есть блокировки памяти. В C# это fixed.
У меня есть идея сделать как то так:
begin
var a := Arr(1,2,3);
{$arrptr a}
for var i:integer := 0 to a.Length-1 do
begin
a[i] := a[i]+1;
end;
end.
Ожидается что в следующем за директивой блоке (то есть во всём for
) доступ к элементам массива будет по указателю вместо стандартного. Ну и весь блок, конечно, в fixed
.
Можно ещё специально для for
оптимизировать, чтоб сотни указателей не создавать, а только прибавлять по 1 к указателю на каждой итерации.
Золотые слова! Браво! Давайте так и сделаем!
Не вижу ничего больше.
Ладно. Вот код:
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 мсек.