Микрооптимизация 4-сегментной гистограммы большого массива или спискаC#

Место общения программистов C#
Ответить
Anonymous
 Микрооптимизация 4-сегментной гистограммы большого массива или списка

Сообщение Anonymous »

У меня особый вопрос. Я постараюсь описать это как можно точнее.

Я делаю очень важную «микрооптимизацию». Цикл, который выполняется несколько дней подряд. Так что, если я смогу сократить время этих циклов, это займет вдвое меньше времени. 10 дней сократятся до 5 дней и т. д.

У меня сейчас есть цикл — это функция: «testbenchmark1».

У меня есть 4 индекса, которые мне нужно увеличить в таком цикле. Но, как я заметил, при доступе к индексу из списка это занимает дополнительное время. Вот что я пытаюсь выяснить, есть ли другое решение.


indexes[n]++; //increase correct index

Полный код для «testbenchmark1», который занимает 122 мс:

void testbenchmark00()
{
Random random = new Random();
List indexers = new List();
for (int i = 0; i < 9256408; i++)
{
indexers.Add(random.Next(0, 4));
}
int[] valueLIST = indexers.ToArray();

Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();

int[] indexes = { 0, 0, 0, 0 };
foreach (int n in valueLIST) //Takes 122 ms
{
indexes[n]++; //increase correct index
}

stopWatch.Stop();
MessageBox.Show("stopWatch: " + stopWatch.ElapsedMilliseconds.ToString() + " milliseconds");
}


Приведенный ниже код «testbenchmark2» является просто экспериментальным, и я знаю, что он неверен, но мне интересно, есть ли какой-либо аналогичный способ использования таких чисел: «1_00_00_00_00 " и можно ли было бы увидеть: "00_00_00_00" как четыре разных целых числа. Например, если бы я суммировал: 1_00_00_00_00 + 1_00_01_00_00 = 1_00_01_00_00, а затем можно было бы в конце извлечь каждое число, каждое из четырех, например: 00, 01, 00, 00

Но я не знаю, возможно ли это где-нибудь даже с использованием двоичных чисел. Да любое решение. Просто добавить такие цифры. В качестве теста этот цикл занял всего 59 мс, что вдвое меньше 122 мс. Так что мне интересно посмотреть, есть ли в этом какая-нибудь идея?

double num3 = 1_00_00_00_00;
double num4 = 1_00_01_00_00;
for (int i = 0; i < valueLIST.Count; i++) //Takes 59 ms
{
num3 += num4;
}


Полный код для «testbenchmark2», который занимает 59 мс:

void testbenchmark2()
{
List valueLIST = new List();
for (int i = 0; i < 9256408; i++) //56
{
valueLIST.Add(i.ToString());
}

//https://www.geeksforgeeks.org/binary-li ... n-c-sharp/
double num3 = 1_00_00_00_00;
double num4 = 1_00_01_00_00;

Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
for (int i = 0; i < valueLIST.Count; i++) //Takes 59 ms
{
num3 += num4;
}
stopWatch.Stop();
MessageBox.Show("stopWatch: " + stopWatch.ElapsedMilliseconds.ToString() + " milliseconds\n\n" + num3);
}


РЕДАКТИРОВАТЬ

Ниже приведен более понятный код того, что я пытаюсь сделать. Точно!

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

void newtest()
{
double num1 = 1_00_00_00_00;
double num2 = 1_00_01_00_00;
double num3 = 1_00_01_01_00;

List testnumbers = new List();
testnumbers.Add(num1);
testnumbers.Add(num2);
testnumbers.Add(num3);

double SUM = 0;
for (int i = 0; i < testnumbers.Count; i++)
{
SUM += testnumbers;
}

//The result is
//300020100

//Would it possible to extract the "four buckets" that I am interesting in somehow?
//00_02_01_00
}


Подробнее здесь: https://stackoverflow.com/questions/611 ... ay-or-list
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»