Функция Delphi для отображения числа байтов как Windows Does

На самом деле C# действительно не работает в виртуальной машине как Java, делает. IL компилируется в ассемблер, который является совершенно собственным кодом и работает на той же скорости как собственный код. Вы можете предварительный JIT приложение.NET, которое полностью удаляет стоимость JIT, и затем Вы выполняете совершенно собственный код.

замедление с.NET произойдет, не потому что код.NET медленнее, но потому что это делает намного больше негласно, чтобы сделать, вещам нравится, собирают "мусор", проверяют ссылки, хранят полные стековые фреймы, и т.д. Это может быть довольно мощно и полезно при создавании приложений, но также и прибывает в стоимость. Обратите внимание, что Вы могли сделать все эти вещи в программе C++ также (большая часть базовой функциональности.NET является на самом деле кодом.NET, который можно просмотреть в РОТОРЕ). Однако, если бы Вы вручаете, записал ту же функциональность, Вы, вероятно, закончили бы с намного более медленной программой, так как время выполнения.NET было оптимизировано и точно настроено.

Тем не менее одни из преимуществ управляемого кода - то, что это может полностью поддаваться проверке, т.е. можно проверить, что код никогда не будет получать доступ к памяти других процессов или делать немудрые вещи перед выполнением его. Microsoft имеет прототип исследования полностью управляемой операционной системы, которая удивительно показала, что 100%-я управляемая среда может на самом деле работать значительно быстрее, чем какая-либо современная операционная система путем использования в своих интересах этой проверки для выключения средств защиты, которые больше не необходимы управляемым программам (мы говорим как 10x в некоторых случаях). Радио SE имеет большой эпизод, говорящий об этом проекте.

6
задан lkessler 17 August 2009 в 06:31
поделиться

2 ответа

См. Следующие функции, все в библиотеке shlwapi .

Любой из них даст вам первое часть желаемого формата отображения. Проверьте документацию или напишите свои собственные тесты, чтобы убедиться, что они дают ожидаемые преобразования в зависимости от того, состоит ли мегабайт из 1000 или 1024 килобайт. Для второй части вашего формата отображения вы можете начать с ответов на другой вопрос о переполнении стека:

Но, возможно, этот вопрос - неправильный путь для обсуждения, поскольку все предложения там, а также FloatToStrF терпят неудачу при достижении верхних пределов Int64 . Вы потеряете несколько байтов, но я считаю их очень важными, поскольку цель второго значения в этом формате отображения - предоставить точное число.

Когда у вас есть все части, склейте их вместе. Я использую здесь гипотетическую функцию IntToStrCommas , и если вы хотите реализовать ее как FloatToStrF , продолжайте.

function BytesToDisplay(const num: Int64): string;
var
  // If GB is the largest unit available, then 20 characters is
  // enough for "17,179,869,183.99 GB", which is MaxUInt64.
  buf: array[0..20] of Char;
begin
  if StrFormatByteSize64(num, buf, Length(buf)) = nil then
    raise EConvertError.CreateFmt('Error converting %d', [num]);
  Result := Format('%s (%s bytes)', [buf, IntToStrCommas(num)]);
end;
12
ответ дан 8 December 2019 в 13:48
поделиться

Не совсем то, что вам нужно, но у меня есть функция в моей библиотеке, которая может дать вам представление о том, как с этим справиться:

function FormatByteSize(const bytes: Longword): string;
var
  B: byte;
  KB: word;
  MB: Longword;
  GB: Longword;
  TB: UInt64;
begin

  B  := 1; //byte
  KB := 1024 * B; //kilobyte
  MB := 1000 * KB; //megabyte
  GB := 1000 * MB; //gigabyte
  TB := 1000 * GB; //teraabyte

  if bytes > TB then
    result := FormatFloat('#.## TB', bytes / TB)
  else
    if bytes > GB then
      result := FormatFloat('#.## GB', bytes / GB)
    else
      if bytes > MB then
        result := FormatFloat('#.## MB', bytes / MB)
      else
        if bytes > KB then
          result := FormatFloat('#.## KB', bytes / KB)
        else
          result := FormatFloat('#.## bytes', bytes) ;
end;
5
ответ дан 8 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: