Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/25: Рейтинг темы: голосов - 25, средняя оценка - 4.64
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676

Варианты конвертации bool/byte/int в byte/int

11.01.2019, 12:56. Показов 5861. Ответов 102
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В Си, если мне не изменяет память можно наоборот любые данные интерпретировать как true/false. А вот меня интересует преобразование числовых данных отличных от нуля в единицу, а нулевых значений в ноль.
Я воспользовался уже двумя реализациями (на самом деле есть еще две, но они сильно зависят от контекста и не являются универсальными), и по производительности остановился на первой:
1)
C#
1
2
3
byte x1;
byte x2;
x2 = (byte)((x1) == 0 ? 0 : 1);
2) у меня данные не могут быть более 32, поэтому такой вариант тоже возможен
C#
1
2
3
4
public static readonly byte[] BitsValue =    { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 };
byte x1;
byte x2;
x2 = BitsValue[x1];
Если написал сумбурно, то меня интересует код, который из любого положительного числа делает 1, а из нуля - 0. Так же как частный случай использовался такой код:
C#
1
2
3
byte x1;
byte x2;
x2 = (byte)((x1 & 8) >> 3);
Что можете подсказать ещё?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.01.2019, 12:56
Ответы с готовыми решениями:

int в byte
как перевести int в byte а потом обратно в int???

Как переконвертировать int в byte[]?
Как переконвертировать hex занчение int в byte? Чтобы int a = 0x45C5; cтало byte b = new byte {0x45, 0xC5}; udp: и наоборот тоже

Ошибка после конвертации метода на С++ к С#: "Неявное преобразование типа "int" в "bool" невозможно"
Ошибка после преобразования метода на С++ к С#: "Неявное преобразование типа "int" в "bool" невозможно" Метод взят...

102
Эксперт .NET
 Аватар для Usaga
14368 / 9469 / 1360
Регистрация: 21.01.2016
Сообщений: 35,733
17.01.2019, 11:12
Студворк — интернет-сервис помощи студентам
belalugoci, а можно оформить код в виде консольного приложения, без потоков и кучи нечитаемого говнокода?
1
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
17.01.2019, 11:47  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
оформить в виде консольного приложения, без потоков
если консольное еще можно понять, сделаю, а потоки зачем убирать? чтобы ждать результат пол часа?
0
Эксперт .NET
 Аватар для Usaga
14368 / 9469 / 1360
Регистрация: 21.01.2016
Сообщений: 35,733
17.01.2019, 11:58
belalugoci, чтобы был "чистый" алгоритм. Чтобы результаты ваших "замеров" не изменялись из-за многопоточности (false-sharing и тому подобными вещами). А так каша.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
17.01.2019, 12:44
belalugoci, почитал всё переписку. Не обессудьте, если не в тему.

Первоначальный Ваш вариант x2 = (byte)((x1) == 0 ? 0 : 1);
после компиляции (Relase, конечно) и сопутствующей оптимизации будет выполняться за один машинный такт. Быстрее не возможно. Даже если это по разному записывается на ассемблере, то сейчас (в отличии от 90г.) машинный кода не выполняется процессором непосредственно, он внутри него транслируется в RISC- микроинструкции и оптимизируется дополнительно. На результаты замеров будет влиять не скорость выполнения самой этой операции, а её окружения. В первую очередь с какой скоростью и каким образом поставляются/забираются данные. Для этого надо учитывать заполняемость внутренних кешей процессоров, что на C# невозможно. И придётся полагаться на внутренние механизмы Net платформы - результаты могут быть непредсказуемыми.

Так же непонятна общая цель Вашей задачи. Ну, получите Вы оптимизацию в 1000 раз.... А что это Вам даст? Ускорение расчёта для варианта 5х5 до 1 секунды? Ну, пусть даже до 1 нс. И что? Ваша же задача обсчитывать должна 64х64. Для неё всё равно время выполнения останется вне разумных пределов.
0
95 / 74 / 27
Регистрация: 13.08.2018
Сообщений: 203
17.01.2019, 13:29
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Первоначальный Ваш вариант x2 = (byte)((x1) == 0 ? 0 : 1);
после компиляции (Relase, конечно) и сопутствующей оптимизации будет выполняться за один машинный такт.
На моей машине тесты говорят что test != 0 ? 1 : 0 на 25% медленнее чем просто test != 0.
На ассемблере (в релизе) это выглядит так
esi != 0 ? 1 : 0
Assembler
1
2
3
4
5
test    esi, esi
jne     00960493
xor     ecx, ecx
jmp     00960498
mov     ecx, 1
esi != 0
Assembler
1
2
3
test    esi, esi
setne   cl
movzx   ecx, cl
Как видим первый вариант использует условные переходы, что для скорости уже не гуд. Я верю что может быть на современном процессоре эта абракадабра может выполнится за один такт, но на моей старенькой машине это увы не так.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
17.01.2019, 13:36  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
И что? Ваша же задача обсчитывать должна 64х64
Если доберусь до 16х16 меня это пока устроит, 5х5 выбрано только как задача, которую я могу решать за приемлемо малое время. Я морально уже готов перейти к 6х6, но у меня нет аппаратной платформы для этого. Возможно соберу себе Xeon 4/8 платформу, благо китайцы продают её за вменяемые деньги.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
17.01.2019, 13:41
Цитата Сообщение от maximka777 Посмотреть сообщение
Как видим первый вариант использует условные переходы, что для скорости уже не гуд. Я верю что может быть на современном процессоре эта абракадабра может выполнится за один такт, но на моей старенькой машине это увы не так.
Здесь разница в самом типе выходных данных. Что нужно на выходе bool или byte? Если byte, то добавляется ещё операция конвертирования из bool в byte

И второе, я не спец в этих настройка, но мне на примерах пару раз показали неверность моих рассуждений о неоптимальности C#. Надо настраивать уровень оптимизации кода. Сам в этом пока не разбирался. Просто убедился, что конечный код C# очень сильно зависит от этих настроек. Скорость порой меняется в разы.

Добавлено через 4 минуты
Цитата Сообщение от belalugoci Посмотреть сообщение
Если доберусь до 16х16 меня это пока устроит, 5х5 выбрано только как задача, которую я могу решать за приемлемо малое время. Я морально уже готов перейти к 6х6, но у меня нет аппаратной платформы для этого. Возможно соберу себе Xeon 4/8 платформу, благо китайцы продают её за вменяемые деньги.
На мой взгляд человека который не сильно в теме, Вам всё равно не выкрутиться.
Для конечного решения, Вам надо поменять как теоретический алгоритм, так и платформу. Допустим, вести расчёты на графических ускорителях. Там одновременно доступны сотни процессоров.
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
17.01.2019, 13:42  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
чтобы был "чистый" алгоритм. Чтобы результаты ваших "замеров" не изменялись из-за многопоточности (false-sharing и тому подобными вещами). А так каша.
понял вас, но согласен лишь частично. код переделал. могу убрать любые оптимизации вообще, чтобы вы смогли взглянуть на задачу без примеси моей фантазии.
Вложения
Тип файла: 7z CalcBitsCL.7z (135.0 Кб, 4 просмотров)
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
17.01.2019, 13:44  [ТС]
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Допустим, вести расчёты на графических ускорителях.
я уже занят этим вопросом, но не уверен что потяну такую задачу.

Цитата Сообщение от Элд Хасп Посмотреть сообщение
код C# очень сильно зависит от этих настроек. Скорость порой меняется в разы.
о чем речь?
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
17.01.2019, 14:22
Цитата Сообщение от belalugoci Посмотреть сообщение
о чем речь?
Я сам токо начинаю C# осваивать (менее полугода), но столкнулся с этим. В том числе в этом разделе. Тоже зашёл спор о более оптимальных методах, и я высказал своё мнение о неоптимальности C# сославшись на ассемблерный код (тоже в моём 25-летней давности понимании). Ну, мне и показали, что я просто не знаю как правильно настраивать компилятор C#. К сожаления, большего сказать не могу. Так как большой надобности самому не было, а есть в C# многое другое, что меня интересует больше.
И, конечно, в любом случае, "вручную" на ассемблере часто можно получить более оптимальный, но это максимум 20-50%. Очень сильно можно оптимизировать решение, если реализовывать на ассемблере целиком обработку, так как я уже писал, основная задержка возникает на вводе/выводе данных, на их преобразовании. C# же целиком не может понимать что делает по смыслу код, поэтому и не может полностью его оптимизировать.
Если разбить код и данные так, что бы всё происходило в рамках кешей процессора, то можно добиться существенного ускорения.

Добавлено через 26 минут
belalugoci, такой интерес. Что за данные у Вас в исходной матрице? Зачем на каждом шаге производить приведение byte к 0 : 1 ? Почему для выходных данных не использовать bool раз нужны только два значения?
Можно ли один раз привести всю матрицу к выходному формату и потом использовать эту копию?
1
 Аватар для Рядовой
1524 / 914 / 329
Регистрация: 17.05.2015
Сообщений: 3,438
17.01.2019, 15:09
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Допустим, вести расчёты на графических ускорителях. Там одновременно доступны сотни процессоров.
Видеокарта изначально заточена для многопоточных операций по преобразованию полигонов в пиксели. При том потоки команд распаралелены изначально и никаких расходов на распаралеливание инструкций у GPU нет. Есть, конечно, проекты по неграфическим расчетам на видеокартах, но прирост там сильно зависит от условий, тем более что CPU тоже остается нагруженным. В общем это уж точно не в рамках конкретной задачи.
0
Эксперт .NET
 Аватар для Usaga
14368 / 9469 / 1360
Регистрация: 21.01.2016
Сообщений: 35,733
17.01.2019, 17:45
Кому лень качать архив:

Кликните здесь для просмотра всего текста

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
using System;
using System.Diagnostics;
 
namespace CalcBitsCL
{
    class Program
    {
        static object locker = new object();
 
        // это расчётные значения для работы с матрицей 5х5, но с фиксированным одним значение верхнего элемента, я тестировал со значением 0, но работает и с любым но одиночным значением
        // это большая оптимизация которая позволила резко сократить число операций, значения в массиве обозначают места для разных значений SumBits
        // идея в том, что сравнивать одни данные с другими имеет смысла только если суммы бит одинаковые, так мы сокращаем число итераций для For(Compare)
        public static readonly int[] DimIdx = { 0, 1, 21, 211, 1351, 6196, 21700, 60460, 137980, 263950, 431910, 616666, 784626, 910596, 988116, 1026876, 1042380, 1047225, 1048365, 1048555, 1048575, 1048576, 1048576, 1048576, 1048576, 1048576, 1048576 };
        public static int[] countNidx = { 0, 1, 21, 211, 1351, 6196, 21700, 60460, 137980, 263950, 431910, 616666, 784626, 910596, 988116, 1026876, 1042380, 1047225, 1048365, 1048555, 1048575, 1048576, 1048576, 1048576, 1048576, 1048576, 1048576 };
 
        public static DimBitsS[] DimBitsSN = new DimBitsS[1048576]; // число элементов матрицы 5х5, но для одного значения верхнего вектора, то есть формально 2 в двадцатой степени + 1
        public static byte SumBits = 0; // хранит сумму бит, является так же индексом для DimIdx и countNidx
 
        public static byte x1, x2, x3, x4, x5; // числа, используемые для отражения значений матрицы 5х5, x1 - верх, x5 - низ
 
        public static ulong countN = 0; public static ulong countIn = 0; public static ulong countX, old_countX; public static int num1, num2;
 
        public struct DimBitsS
        {
            public byte[] Bits; // массив сумм бит
            public int Sum; // значение SumBits сохранённое во время расчета каждого элемента
            public byte Hash; // XOR хэш
            public byte CRC8; // CRC8
 
            public DimBitsS(int _Sum) // инициализация
            {
                this.Sum = _Sum;
                this.Hash = 0;
                this.CRC8 = 0;
                this.Bits = new byte[28];
            }
        }
 
        public static void Compare(int y)
        {
        }
 
        public static byte BitCount(ulong value) // считаем число бит в переменной
        {
            ulong result = value - ((value >> 1) & 0x5555555555555555UL);
            result = (result & 0x3333333333333333UL) + ((result >> 2) & 0x3333333333333333UL);
            return (byte)(unchecked(((result + (result >> 4)) & 0xF0F0F0F0F0F0F0FUL) * 0x101010101010101UL) >> 56);
        }
 
        static class CRC8 // расчет CRC8, нужно такое же, но на CRC32
        {
            static byte[] CRC8_TABLE = new byte[]{
                0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
                157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
                35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
                190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
                70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
                219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
                101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
                248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
                140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
                17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
                175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
                50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
                202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
                87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
                233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
                116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53 };
 
            public static byte Calculate(byte[] data, byte init = 0)
            {
                byte result = init;
                for (var i = 0; i < 20/*data.Length*/; i++) // по алгоритму конечно надо ставить data.Length, но для моего алгоритма это значение 28, а лучшую скорость даёт 20
                {
                    result = CRC8_TABLE[result ^ data[i]];
                }
                return result;
            }
        }
 
        static void Main(string[] args)
        {
            int temp, old_percent = 0; // инициализация счетчиков и временных переменных
            num1 = 0; num2 = 0;
            if (num1 >= num2) num2 = num1 + 1; else num2++; // по большому счёту нужно только если первое и второе значения менять, если ничего не трогать, то можно не обращать внимание
            for (x1 = (byte)num1; x1 < (byte)num2; x1++) // первая переменная из матрицы 5х5 бит (условно верхняя)
            {
                countN = 0; countX = 0; old_countX = 0; // инициализация счетчиков
                var sw = Stopwatch.StartNew(); // запуск таймера
                for (x2 = 0; x2 < 32; x2++) // вторая переменная из матрицы
                {
                    // обновление элементов на форме, происходит только если данные изменились
                    temp = (int)((ulong)countN * (ulong)(x1 + 1) * 100 / (ulong)(Math.Pow(32, 4) * (num2 - num1))); // тут я набредил и больше не трогал, используется для вычисления шкалы ProgressBar, нормально работает для одного значения x1, по если x1 > 0 будет показывать криво
                                                                                                                    // обновление ProgressBar и Label с процентом
                    // порой достаточно посмотреть 50% от всей программы (это примерно 33% от всего объёма вычислений)
                    if (old_percent != temp)
                    {
                        Console.WriteLine(temp.ToString() + "%");
                        old_percent = temp;
                    }
                    for (x3 = 0; x3 < 32; x3++) // третья переменная из матрицы
                    {
                        for (x4 = 0; x4 < 32; x4++) // четвертая из матрицы
                        {
                            for (x5 = 0; x5 < 32; x5++) // пятая переменная
                            {
                                SumBits = (byte)(BitCount(x1) + BitCount(x2) + BitCount(x3) + BitCount(x4) + BitCount(x5)); // сумма сумм бит
                                DimBitsSN[countNidx[SumBits]] = new DimBitsS(SumBits); // инициализация данных в структуре
 
                                // заполнение массива в структуре
                                DimBitsSN[countNidx[SumBits]].Bits[0] = (byte)BitCount(x5); // (byte) тут нужно только если поменять логику вычисления суммы бит
                                DimBitsSN[countNidx[SumBits]].Bits[1] = (byte)BitCount(x4); // можно придумать свои варианты суммирования, например
                                DimBitsSN[countNidx[SumBits]].Bits[2] = (byte)BitCount(x3); // ((x1) == 0 ? 0 : 1)
                                DimBitsSN[countNidx[SumBits]].Bits[3] = (byte)BitCount(x2); // в таком случае оптимизации нужно подстраивать под контекст
                                DimBitsSN[countNidx[SumBits]].Bits[4] = (byte)BitCount(x1); // например для моих алгоритвом расчёта я выяснил какие именно данные чаще меняются
                                DimBitsSN[countNidx[SumBits]].Bits[5] = (byte)BitCount(x5); // и отсортировал их в этом массиве, где 0 - часто, 27 - редко
                                DimBitsSN[countNidx[SumBits]].Bits[6] = (byte)BitCount(x4);
                                DimBitsSN[countNidx[SumBits]].Bits[7] = (byte)BitCount(x3);
                                DimBitsSN[countNidx[SumBits]].Bits[8] = (byte)BitCount(x2);
                                DimBitsSN[countNidx[SumBits]].Bits[9] = (byte)BitCount(x1);
                                DimBitsSN[countNidx[SumBits]].Bits[10] = (byte)BitCount(x5);
                                DimBitsSN[countNidx[SumBits]].Bits[11] = (byte)BitCount(x4);
                                DimBitsSN[countNidx[SumBits]].Bits[12] = (byte)BitCount(x3);
                                DimBitsSN[countNidx[SumBits]].Bits[13] = (byte)BitCount(x2);
                                DimBitsSN[countNidx[SumBits]].Bits[14] = (byte)BitCount(x1);
                                DimBitsSN[countNidx[SumBits]].Bits[15] = (byte)BitCount(x5);
                                DimBitsSN[countNidx[SumBits]].Bits[16] = (byte)BitCount(x4);
                                DimBitsSN[countNidx[SumBits]].Bits[17] = (byte)BitCount(x3);
                                DimBitsSN[countNidx[SumBits]].Bits[18] = (byte)BitCount(x2);
                                DimBitsSN[countNidx[SumBits]].Bits[19] = (byte)BitCount(x1);
                                DimBitsSN[countNidx[SumBits]].Bits[20] = (byte)BitCount(x5);
                                DimBitsSN[countNidx[SumBits]].Bits[21] = (byte)BitCount(x4);
                                DimBitsSN[countNidx[SumBits]].Bits[22] = (byte)BitCount(x3);
                                DimBitsSN[countNidx[SumBits]].Bits[23] = (byte)BitCount(x2);
                                DimBitsSN[countNidx[SumBits]].Bits[24] = (byte)BitCount(x1);
                                DimBitsSN[countNidx[SumBits]].Bits[25] = (byte)BitCount(x5);
                                DimBitsSN[countNidx[SumBits]].Bits[26] = (byte)BitCount(x4);
                                DimBitsSN[countNidx[SumBits]].Bits[27] = (byte)BitCount(x3);
 
                                // заполняем CRC8
                                DimBitsSN[countNidx[SumBits]].CRC8 = CRC8.Calculate(DimBitsSN[countNidx[SumBits]].Bits);
 
                                // считаем и заполняем XOR хэш
                                for (var h = 0; h < 3; h++) DimBitsSN[countNidx[SumBits]].Hash ^= DimBitsSN[countNidx[SumBits]].Bits[h];
 
                                // запускаем основной цикл сравнения. Условие смотрит только за тем, чтобы проверка запускалась только если более одного значения посчитано
                                if (countN > 0 && DimIdx[SumBits] != countNidx[SumBits])
                                {
                                    for (var i = DimIdx[SumBits]; i < (DimIdx[SumBits] == countNidx[SumBits] ? countNidx[SumBits] + 1 : countNidx[SumBits]); i++)
                                    {
                                        if (DimBitsSN[countNidx[SumBits]].Hash == DimBitsSN[i].Hash)
                                        {   // этот хэш простой XOR, число переменных выбирается
                                            // в BackgroundThreadFunc() до вызова For(Compare),
                                            // текущее значение выбрано опытным путём
                                            if (DimBitsSN[countNidx[SumBits]].CRC8 == DimBitsSN[i].CRC8) // функция взята с одной из тем Cyberforum
                                                                                                         // тоже не иду по всем byte[], значение подобрано
                                            {
                                                countIn++; // так увидим число входов, оно определяет продолжительность вычислений
                                                for (var n = 0; n < 24; n++)
                                                {
                                                    if (DimBitsSN[countNidx[SumBits]].Bits[n] == DimBitsSN[i].Bits[n])
                                                    // если прошли через хэши, то проверяем от частого к редкому и отлавливаем совпавшие
                                                    {
                                                        countX++; // число совпавших
                                                    }
                                                }
                                            }
                                        }
                                    }
                                }
 
                                countN++; // общее число итераций
                                countNidx[SumBits]++; // движение указателей на данные
                            }
                        }
                    }
                }
                sw.Stop(); // таймер времени выполнения программы
                Console.WriteLine(countIn.ToString() + " : " + countX.ToString() + " : " + sw.Elapsed.ToString());
            }
            Console.WriteLine("Цимес!!! Прес эни кий ту континью...");
            Console.ReadKey();
        }
    }
}


belalugoci, я что-то в коде не увидел сравнения производительности "табличного метода" с простым (x1) == 0 ? 0 : 1.
0
17.01.2019, 18:30

Не по теме:


что-то мне кажется, что это попытка вызвать дьявола...

0
17.01.2019, 19:34

Не по теме:

nedel, наоборот. Мне кажется, что оно даже дьявола отпугнёт... Хбз производительность чего тут можно замерить.

0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
17.01.2019, 20:00  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
я что-то в коде не увидел сравнения производительности "табличного метода" с простым (x1) == 0 ? 0 : 1.
а почему вы ожидали это увидеть?
вы хотели как можно более чистый код, я это дал.
как я уже говорил много раз - программа простая как 1-2-3, и любые действия её или усложняют или упрощают, поэтому счёт идёт на инструкции. Например оптимизация с countNidx дала больше, чем история с x1 == 0.

Цитата Сообщение от Рядовой Посмотреть сообщение
тем более что CPU тоже остается нагруженным
у меня бегает майнер ETH, ЦПУ при этом нагружен практически никак, а вот видеокарта работает прилично.
Миниатюры
Варианты конвертации bool/byte/int в byte/int  
0
 Аватар для belalugoci
475 / 294 / 29
Регистрация: 01.06.2018
Сообщений: 3,676
17.01.2019, 20:02  [ТС]
Цитата Сообщение от Usaga Посмотреть сообщение
Хбз производительность чего тут можно замерить
есть разница CRC оно бы считало или SHA или MD5 - это просто одни цифры перегоняются в другие. В моём случае считаются операции над битами (их суммами). Можете подставлять любые свои операции - основное тело вообще не изменится.
0
Эксперт .NET
 Аватар для Usaga
14368 / 9469 / 1360
Регистрация: 21.01.2016
Сообщений: 35,733
17.01.2019, 20:04
Цитата Сообщение от belalugoci Посмотреть сообщение
а почему вы ожидали это увидеть?
Потому, что именно это я от вас и просил Вы ранее заявили, что самый простейший вариант (с тернарным оператором) отработал сильно хуже, чем табличное непойми что из первого поста. Я это обозвал чушью и попросил код, на котором это было бы наглядно видно.

Мы, видимо, не поняли друг друга. А то, что в архиве, ценности не представляет, ибо хбз что там считается и по каким принципам.
0
Эксперт .NET
6691 / 4102 / 1607
Регистрация: 09.05.2015
Сообщений: 9,576
17.01.2019, 20:55
belalugoci, у меня ваш алгоритм с консольного проекта получилось ускорить примерно в 4.6 раза.

Правда что там считается и зачем совершенно не понятно...

оригинал
2260798720 : 50585009280 : 00:11:22.8599672
после оптимизаций
2260798720 : 50585009280 : 00:02:28.5046431
0
 Аватар для Lexeq
1151 / 743 / 483
Регистрация: 21.01.2014
Сообщений: 1,903
17.01.2019, 21:44
Цитата Сообщение от maximka777 Посмотреть сообщение
test != 0 ? 1 : 0 на 25% медленнее чем просто test != 0
А ничего, что это два кусочка делают разные вещи? Проверка числа на простоту будет еще медленнее, только смысл сравнивать разные операции.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16158 / 11278 / 2891
Регистрация: 21.04.2018
Сообщений: 33,164
Записей в блоге: 2
17.01.2019, 22:04
belalugoci, чем дальit идёт обсуждение, тем больше складывается у меня впечатление, что проблема не в реализации, а в неверном выборе методологии решения.
Не зная, что Вам там нужно делать, очень трудно подсказать правильное решение. А у Вас, похоже, из-за недостатка знаний в программировании, не получается найти правильное решение.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.01.2019, 22:04

преобразование ref byte в byte[] или в IntPtr без использования неуправляемого кода
есть COM интерфейс с методом: virtual /* */ HRESULT STDMETHODCALLTYPE OnReceivePacket( /* */ long dwSize, ...

Как перевести byte[] или переменную типа IntPtr к типу byte[] (ассемблерные инструкции)?
Наткнулась на проблему, нужно перевести тип IntPtr в массив ассемблерной инструкции. Вот пример кода, который нужно справить: ...

Пердача byte[] COM-функции, ожидающей ref byte
Привет, наше приложение в C# использует несколько COM-интерфейсов. В одном из них есть метод, которому передается ref byte : ...

wav byte[] в flac byte[]
Ситуация такая: С микрофона каждую 0.1 сек идет byte где то по 3к значений. Если я пишу его в файл то получается как бы wav файл....

Linq преобразовать DataTable в Dictionary<int,List<int>
Добрый день, помогите пожалуйста, со следующей задачей. Есть DataTable состоящий из 2 колонок: первая колонка id группы, вторая колонка id...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Вангую, что это не пройдёт модерацию, и на неделе я запущу свой сервер.
Hrethgir 19.07.2026
Эта публикация сейчас в песочнице и ждёт приглашения. https:/ / habr. com/ ru/ sandbox/ 295048/ начало и оглавление - Как «пернатого» заставить осваивать новые горизонты опыта через масштабирование. . .
сукцессия 33. открытые вопросы от клауде
anaschu 19.07.2026
"Что накопилось за эту часть А — тринадцать правок, из которых шесть пришли из ваших вопросов и каждая оказалась реальной ошибкой, а не калибровкой: односторонний симбиоз, отсутствующий листопад,. . .
32 сукцессия
anaschu 19.07.2026
сукцессия 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не «подкручивает» сходимость —. . .
сукцессия 31: модель микоризы - это модель ещё нескольких явлений, социальных и экономических
anaschu 18.07.2026
Теория «Всего»: апдейт v1. 1. 2 — 28‑мерное ядро стабилизировано Коллеги, фиксирую разбор инженерных правок и их изоморфную проекцию на экономику, меметику и половой отбор. Модель теперь не. . .
сукцессия 30. Массив проверяющих друг друга моделей
anaschu 18.07.2026
Архитектура сети взаимопроверяющих моделей микоризной сукцессии (v2. 0) Развитие тензорного ОДУ-ядра и создание кросс-платформенного калибровочного полигона Уважаемые коллеги! В продолжение. . .
Грибы - это женщины, деревья - это мужчины. Анти инь янь для союза мужчины и женщины.
anaschu 18.07.2026
ГЛАВНЫЙ НАУЧНО-ФИЛОСОФСКИЙ ВЫВОД: Сексуально-Репродуктивный Капитализм против Государства Моногамии Коллеги, мы вышли на финишную прямую 20-мерного ОДУ-моделирования вековой сукцессии (ветка. . .
Текстовый слайдер с нумерацией страниц и кроссбраузерность.
russiannick 18.07.2026
Один мой друг написал текстовый слайдер с нумерацией страниц. Сегодня я расскажу как он умудрился подружить его с кроссбраузерностью. Очевидно сложно угодить с шириной каждому браузеру. Один крадет. . .
Грибы - это мемы, дерево - это человек. Применение микоризной модели к теории меметики Докинза.
anaschu 18.07.2026
Меметический изоморфизм теории «всего»: Грибная сукцессия как модель эволюции идей Докинза Базовый код системы ОДУ микоризной сукцессии описывает не просто биологию, а универсальную. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru