Буферы протокола: я должен использовать int64 или fixed64 для представления значения DateTime.NET?

Вы звоните pizzaPrice(), но вам нужно сохранить полученное значение в переменной, чтобы вы могли использовать его позже (и передать правильные параметры).

double pricePerInchRound = pizzaPrice(radius, priceRound);

и ...

double pricePerInchRect = pizzaPrice(width, length, priceRect);

Кроме того, позаботьтесь о том, чтобы лучше называть параметры вашего метода - num1, num2 не очень описательны. Вы могли бы использовать ширину, длину.

7
задан Mike Dinescu 7 May 2009 в 23:39
поделиться

3 ответа

Что ж, вы определенно хотите, чтобы int64 или sfixed64 справились со значением, которое подписывается.

Только что выполнив быстрый тест, DateTime.Now.ToBinary () кодируется в 10 байтов с использованием int64 , тогда как sfixed64 всегда будет использовать 8 байтов. По сути, кодирование переменной длины отлично подходит для небольших чисел, но становится больше, чем фиксированное кодирование для больших чисел. (Это тот же тип компромисса, что и при использовании UTF-8 вместо UTF-16 - символы ASCII можно кодировать в UTF-8 одним байтом, но позже кодовые точки в конечном итоге кодируются как 2, а затем 3 байта, тогда как UTF -16 всегда использует 2 байта для символов в BMP.)

Я предполагаю, что DateTime.

9
ответ дан 6 December 2019 в 19:41
поделиться

Вы должны использовать 64-битное число со знаком, не потому что DateTime может быть отрицательным, а потому что метод ToBinary возвращает Int64 , представляющее собой 64-разрядное число со знаком.

0
ответ дан 6 December 2019 в 19:41
поделиться

In protobuf-net, I use a graduated scale approach (and indeed, it handles all this for you if you simply use DateTime) - the equivalent .proto is something like this:

message DateTime {
  optional sint64 value = 1; // the offset (in units of the selected scale)
                             // from 1970/01/01
  optional TimeSpanScale scale = 2 [default = DAYS]; // the scale of the
                                                     // timespan
  enum TimeSpanScale {
    DAYS = 0;
    HOURS = 1;
    MINUTES = 2;
    SECONDS = 3;
    MILLISECONDS = 4;

    MINMAX = 15; // dubious
  }
}

i.e. if the DateTime can be expressed in whole days, I just send the number of days since 1970, etc - plus a small marker to the scale. This means that dates can be sent a bit more efficiently, but it doesn't really cost much more for other scales.

Personally, I wouldn't use ToBinary() - I would explicitly use an offset of a known scale from a known epoch (such as the unix epoch). This makes it more portable between platforms. But if you are sending (for example) just the millisecond offset, then a fixed scale would usually be more efficient than a variant-length scale. Whether you need signed or unsigned depends on whether you need dates before your epoch ;-p

4
ответ дан 6 December 2019 в 19:41
поделиться
Другие вопросы по тегам:

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