У меня особый вопрос. Я постараюсь описать это как можно точнее.
Я делаю очень важную «микрооптимизацию». Цикл, который выполняется несколько дней подряд. Так что, если я смогу сократить время этих циклов, это займет вдвое меньше времени. 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
Микрооптимизация 4-сегментной гистограммы большого массива или списка ⇐ C#
Место общения программистов C#
1733175910
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" как четыре разных целых числа. Например, если бы я суммировал: [b]1_00_00_00_00 + 1_00_01_00_00 = 1_00_01_00_00[/b], а затем можно было бы в конце извлечь каждое число, каждое из четырех, например: 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-literals-and-digit-separators-in-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);
}
[b]РЕДАКТИРОВАТЬ[/b]
Ниже приведен более понятный код того, что я пытаюсь сделать. Точно!
Но приведенный ниже код, вероятно, будет правильным или решением, но он показывает то, что я пытаюсь сделать, я верю.
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[i];
}
//The result is
//300020100
//Would it possible to extract the "four buckets" that I am interesting in somehow?
//00_02_01_00
}
Подробнее здесь: [url]https://stackoverflow.com/questions/61122144/micro-optimization-of-a-4-bucket-histogram-of-a-large-array-or-list[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия