У меня есть поток десятичных знаков, и я пытаюсь сравнить последнее десятичное число с разницей последних 6 десятичных знаков, я могу увеличить это число.
У меня есть следующее class
public class CompareRandom
{
private const decimal DIFFERENCE = 1.8m;
public decimal a;
public decimal b;
public decimal c;
public decimal d;
public decimal e;
public decimal f;
public decimal g;
public bool Compare(decimal num)
{
this.g = this.f;
this.f = this.e;
this.e = this.d;
this.d = this.c;
this.c = this.b;
this.b = this.a;
this.a = num;
if (b != decimal.Zero && b / DIFFERENCE > a)
{
return true;
}
if (c != decimal.Zero && c / DIFFERENCE > a)
{
return true;
}
if (d != decimal.Zero && d / DIFFERENCE > a)
{
return true;
}
if (e != decimal.Zero && e / DIFFERENCE > a)
{
return true;
}
if (f != decimal.Zero && f / DIFFERENCE > a)
{
return true;
}
if (g != decimal.Zero && g / DIFFERENCE > a)
{
return true;
}
return false;
}
}
Затем я инициализирую его как volatile
volatile static CompareRandom CompareRandom = new CompareRandom();
Затем я вызываю CompareRandom.Compare(value)
синхронно как часть цикла, который обновляет каждый 1ms
для сравнения значений.
Часть, которую я больше всего заинтересован в том, чтобы узнать, есть ли более быстрый способ сделать это часть
this.g = this.f;
this.f = this.e;
this.e = this.d;
this.d = this.c;
this.c = this.b;
this.b = this.a;
this.a = num;
Успешный ответ продемонстрирует более быстрое выполнение метода Compare
Посмотрите, сможете ли вы сделать это быстрее:
Не могли бы вы сформулировать, что вы пытаетесь вычислить здесь? Какая именно задача?
У меня есть поток десятичных знаков, и я пытаюсь сравнить последнее десятичное число с разницей последних 6 десятичных знаков.
Пожалуйста, напишите это в своем вопросе.
Я бы использовал LinkedList<decimal>
Я пытаюсь действовать в порядке очереди, так как я уже в петле.
Итак, Queue<decimal>?
Если ваш код работает и вы ищете рекомендации по его улучшению, вероятно, он лучше подходит для Code Review
Код @Damien_The_Unbeliever, вероятно, не работает, поскольку похоже, что OP пытается выполнить многопоточность с помощью volatile
- с этим я сомневаюсь, что он подходит для CR.
@Damien_The_Unbeliever спасибо, я не знал, что это так, да, я уже использую это и ищу предложения.
@AlexeiLevenkov, можете ли вы объяснить, почему вы так категорически против использования volatile
Я не хочу, чтобы компилятор перемещал вещи, да, я знаю, что снова проверяю реестр.
Вам не нужно выполнять деление каждый раз. Вместо этого умножьте a
на DIFFERENCE
, чтобы получить пороговое значение:
// Name changed to be more conventional
private const decimal Difference = 1.8m;
public bool Compare(decimal num)
{
g = f;
f = e;
e = d;
d = c;
c = b;
b = a;
a = num;
var threshold = num * Difference;
return (b != decimal.Zero && b > threshold) ||
(c != decimal.Zero && c > threshold) ||
(d != decimal.Zero && d > threshold) ||
(e != decimal.Zero && e > threshold) ||
(f != decimal.Zero && f > threshold) ||
(g != decimal.Zero && g > threshold);
};
В дополнение:
Compare
возвращает bool
, а не целое число; учитывая, что это не «общепринятое» значение Compare
, вероятно, стоит переименовать его для ясности.a
) — еще одна веская причина изменить имя.Использование коллекции вместо отдельных переменных сделало бы все это более удобным в сопровождении, но я был бы удивлен, если бы это повысило скорость.
Мне очень нравится эта идея устранения разделения
@Kief: Ваш dotnetfiddle исключает сравнение с нулем, что означает, что он не эквивалентен коду, который вы показали ранее (предположим, что b
равно 0, но num
равно -1 - из-за этого ваш исходный код не вернет true, но ваш dotnetfiddle будет ).
О да, совершенно верно, я рад, что вы указали на это, прежде чем я понял это через несколько часов
Я мог бы переименовать его в CompareNext
вы правы
Мне также очень нравится идея устранения деления, но мне не нравится, как вы обрабатываете логические значения: исходный вопрос говорит что-то вроде:
if condition1 then return true;
if condition2 then return true;
if condition3 then return true;
Если condition1
истинно, то код не заботится о вычислении других условий (зачем, если одно условие равно true
, то OR
всех условий также равно true
).
Предложение от Джона выглядит следующим образом:
return (condition1 || condition2 || condition3)
Это делает ровно то же самое, но тот факт, что вычисление уравнения OR
определяется компилятором: если вы имеете дело со старым компилятором, не выполняющим оптимизацию, то выполняется весь расчет, даже если condition1
равно true
.
Я использую Visual Studio 202x и языковую версию 10, поэтому я не думаю, что мне нужно беспокоиться об этом, сравнивая их после совпадения, меня просто интересует первое совпадение, если вы знаете более быстрый способ, я полагаю, что всегда есть будет медленный путь, где придется проверять их все
Вы говорите, что я должен проверить их отдельно?
@Kief: не в вашем случае, видно, что вы работаете с последними компиляторами. В случае, если вы этого не сделаете, это может быть вариантом.
"а то, что вычисление уравнения ИЛИ определяется компилятором" - нет, это определяется языком. ||
всегда короткое замыкание. Любой компилятор, который оценивает RHS, если LHS верен, просто не работает.
Использование массива
decimal
может упростить чтение и обслуживание вашего кода.