Войти
ПрограммированиеФорумОбщее

Вопросы по Delphi (6 стр)

Страницы: 15 6 7 858 Следующая »
#75
(Правка: 8:02) 7:57, 23 мая 2022

Mirrel
> в твоём варианте вообще все нули выпадут )))
что значит "нули выпадут"?

Mirrel
> он хочет единицы проверить )))
это как-то противоречит "такое же как IndexByte"

#76
8:04, 23 мая 2022

skalogryz
> что значит "нули выпадут"?
при проверке покажет, что там нули (я про первый вариант).

#77
8:07, 23 мая 2022

Mirrel
> при проверке покажет, что там нули (я про первый вариант).
ты про $22448824?
ну разумеется, для этого пример и написан был.

чё-то как-то ТЗ быстро по ходу задания меняется.
сначало было "определить наличие байта отличного от указанного"
а оказываетя надо искать единицы в буфере нулей.

#78
8:11, 23 мая 2022

skalogryz, прошу прощения! А что означает параметр v в приведенном Вами выше коде из #69?

#79
8:11, 23 мая 2022

ArtProg
> skalogryz, прошу прощения! А что означает параметр v в приведенном Вами выше
> коде из #69?
это байт фанат (OnlyFans), которым ты хочешь, чтобы был заполнен буфер.
если функция найдёт какой-то иной байт, она вернёт false.

#80
8:13, 23 мая 2022

skalogryz>сначало было "определить наличие байта отличного от указанного"
а оказываетя надо искать единицы в буфере нулей.

Извиняюсь, что не уточнил вопрос с самого начала. Да, надо проверять именно байты, причем на произвольное ненулевое значение.

#81
8:14, 23 мая 2022

ArtProg
> Извиняюсь, что не уточнил вопрос с самого начала. Да, надо проверять именно
> байты, причем на произвольное ненулевое значение.
я в тебя верю!

function OnlyZeroes(const buf: array of byte): Boolean;
begin
  Result:=OnlyFans(buf, 0);
end;
#82
8:17, 23 мая 2022

  Если ничего не пропустил, то вот что вышло:

var
  arr    : array of byte;
  arr_ptr: PByte;
  i      : integer;

  function OnlyFans(const bt: array of byte; v: byte): Boolean;
  const
    m = ($FFFFFFFF div 255);
  var
    p  : PDWORD;
    trg: longword;
    cnt: integer;
    i  : integer;
  begin
    trg := m * v;
    {$push POINTERMATH}
    {$POINTERMATH ON}
    p := @bt[0];
    cnt := length(bt) div 4;
    i := cnt * 4;
    while cnt>0 do begin
      Result := p^ = trg;
      // Result := (p^ xor trg) = 0;
      if not Result then Exit;
      inc(p);
      dec(cnt);
    end;
    Result:= ( (i>=length(bt)) or (bt[i]=v))
            and ((i+1>=length(bt)) or (bt[i+1]=v))
            and ((i+2>=length(bt)) or (bt[i+2]=v));
    {$pop pointermath}
  end;

begin
  SetLength(arr,8);
  arr_ptr:=@arr[0];
  arr[7]:=1;
  if OnlyFans(arr,1) then
    Writeln('arr[7] is not 0;')
  else
    Writeln('arr[7] is 0;');
  Readln;
end.
Output: 
arr[7] is 0; // хотя выше мы установили 1;
#83
8:22, 23 мая 2022

ArtProg
> Если ничего не пропустил, то вот что вышло:
всё правильно.
ты просил чтобы функция убедилась, что буфер заполнен 1 она вернула тебе false, т.к. буфер начинается с нулей.
если бы буфер бы забит 1, она бы вернула тебе true.

+ Показать
#84
8:34, 23 мая 2022

ArtProg
> Да, надо проверять именно байты, причем на произвольное ненулевое значение.
тут в любом случае проверять всё надо, если тебе конкретно надо знать какой не нулевой. Я бы не заморачивался и просто перебором бы всё проверял.
Другим способом ты просто пропустишь нуль.

skalogryz
думаю в данном случае не обязательна данная функция. Всё рано всё пространство проверять надо, проще просто цикл написать. Если что, развернуть его.

#85
8:36, 23 мая 2022

Mirrel
> думаю в данном случае не обязательна данная функция. Всё рано всё пространство
> проверять надо, проще просто цикл написать. Если что, развернуть его.
по-моему нужна именно функция, и именно произвольная.

существующую функцию можно модифицировать и возвращать index нефаната, либо -1, если все байты нужные, вместо true/false

#86
8:37, 23 мая 2022

skalogryz, все верно вобщем, извиняюсь за невнимательность. Теперь вопрос в скорости, будет ли быстрее, чем простая побайтовая проверка. И если да, то насколько. И будет ли быстрее, чем #67.

#87
8:41, 23 мая 2022

Mirrel, IndexOfByte как то же умудряется делать такие проверки очень быстро. Во всяком случае, явно быстрее, чем простой перебор байтов, как было описано выше. А эти проверки как раз одно из критичных мест в моем алгоритме компрессии изображений на лету.

#88
(Правка: 8:46) 8:44, 23 мая 2022

ArtProg
> Теперь вопрос в скорости, будет ли быстрее, чем простая побайтовая проверка. И
> если да, то насколько
раза в 4, а то и больше.
нужно написать тест да и всё.

ArtProg
> И будет ли быстрее, чем #67.
врят ли.
в 67 сравнивается ровно 8 байт.
в OnlyFans сравнивается произвольный массив байт.

результат №67 - конкретный индекс
результат OnlyFans - true / false

два разных кода, решают разные задачи. Сравнить их можно по скорости, но в целом такое сравнение не имеет большого смысла.

ты можешь в принципе погонять OnlyFans(паскаль) против IndexByte (азм). вот это будет интересное сравнение.
но для точного сравнения нужно использовать большой массив данных. Минимум на мегабайт размером.
Уделает ли написанный человеком ассемблер, код, который сгенерирован компилятором.

#89
8:50, 23 мая 2022

ArtProg, сначала я хотел предложить проверять QWord. Но потом понял, что среди байт может затесаться нуль и мы его пропустим.
Ускорение возможно за счёт SIMD там вроде можно проверить каждые данные на нуль в отдельности. Будет это быстрее? Не знаю, ведь для этого надо будет делать перевод чисел из одного формата в другой. Будет ли стоить овчинка выделки?

Второй вариант ускорения - это запускать всё параллельных потоках. Чем больше потоков, тем больше скорость проверки. Ну и чтоб не проверять по одному байту, закидывать туда кусок массива. В данном случае (вероятно) придётся ждать проверки всех потоков. Либо отлаживать программу чтоб она сначала проверяла первые запущенные потоки (где начало массива), а если ни чего не нашлось, то следующий.
Плюс в том, что при проверке, если даже окажется что байт был не в первом, а в последнем потоке, тебе не надо будет ждать поиска этого байта, а просто его возьмёшь из нужного, первого попавшегося, потока. Ну и конечно тут будет решающее значение за количеством потоков. )))

Страницы: 15 6 7 858 Следующая »
ПрограммированиеФорумОбщее