Есть ли более быстрый способ сравнить эти десятичные дроби?

У меня есть поток десятичных знаков, и я пытаюсь сравнить последнее десятичное число с разницей последних 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

Посмотрите, сможете ли вы сделать это быстрее:

https://dotnetfiddle.net/tLw8qM

https://dotnetfiddle.net/jd0bSF

Использование массива decimal может упростить чтение и обслуживание вашего кода.

Klaus Gütter 10.02.2023 07:57

Не могли бы вы сформулировать, что вы пытаетесь вычислить здесь? Какая именно задача?

Klaus Gütter 10.02.2023 07:58

У меня есть поток десятичных знаков, и я пытаюсь сравнить последнее десятичное число с разницей последних 6 десятичных знаков.

Kief 10.02.2023 07:59

Пожалуйста, напишите это в своем вопросе.

Klaus Gütter 10.02.2023 08:00

Я бы использовал LinkedList<decimal>

Mark Cilia Vincenti 10.02.2023 08:04

Я пытаюсь действовать в порядке очереди, так как я уже в петле.

Kief 10.02.2023 08:05

Итак, Queue<decimal>?

Mark Cilia Vincenti 10.02.2023 08:22

Если ваш код работает и вы ищете рекомендации по его улучшению, вероятно, он лучше подходит для Code Review

Damien_The_Unbeliever 10.02.2023 08:47

Код @Damien_The_Unbeliever, вероятно, не работает, поскольку похоже, что OP пытается выполнить многопоточность с помощью volatile - с этим я сомневаюсь, что он подходит для CR.

Alexei Levenkov 10.02.2023 08:49

@Damien_The_Unbeliever спасибо, я не знал, что это так, да, я уже использую это и ищу предложения.

Kief 10.02.2023 08:52

@AlexeiLevenkov, можете ли вы объяснить, почему вы так категорически против использования volatile Я не хочу, чтобы компилятор перемещал вещи, да, я знаю, что снова проверяю реестр.

Kief 10.02.2023 08:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
11
144
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вам не нужно выполнять деление каждый раз. Вместо этого умножьте 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 10.02.2023 08:57

@Kief: Ваш dotnetfiddle исключает сравнение с нулем, что означает, что он не эквивалентен коду, который вы показали ранее (предположим, что b равно 0, но num равно -1 - из-за этого ваш исходный код не вернет true, но ваш dotnetfiddle будет ).

Jon Skeet 10.02.2023 09:13

О да, совершенно верно, я рад, что вы указали на это, прежде чем я понял это через несколько часов

Kief 10.02.2023 09:14
dotnetfiddle.net/tLw8qM
Kief 10.02.2023 09:16

Я мог бы переименовать его в CompareNext вы правы

Kief 10.02.2023 09:19

Мне также очень нравится идея устранения деления, но мне не нравится, как вы обрабатываете логические значения: исходный вопрос говорит что-то вроде:

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 10.02.2023 09:24

Вы говорите, что я должен проверить их отдельно?

Kief 10.02.2023 09:27

@Kief: не в вашем случае, видно, что вы работаете с последними компиляторами. В случае, если вы этого не сделаете, это может быть вариантом.

Dominique 10.02.2023 09:29
dotnetfiddle.net/jd0bSF У них одинаковый процессор/время выполнения, поэтому я думаю, что предпочитаю этот метод для возврата, спасибо.
Kief 10.02.2023 09:31

"а то, что вычисление уравнения ИЛИ определяется компилятором" - нет, это определяется языком. || всегда короткое замыкание. Любой компилятор, который оценивает RHS, если LHS верен, просто не работает.

Jon Skeet 10.02.2023 10:39

Другие вопросы по теме