Ненависть к std::chrono
От: Cyberax Марс  
Дата: 28.12.20 11:25
Оценка: +1 :)
Скажите, ну вот какой пиииииии в комитете не догадался сделать так, чтобы часы можно было вызывать через виртуальный метод?!?

Ну типа для простейшего случая:
struct some_class {
  std::chrono::base_clock *clock_ = &std::chrono::system_clock;

  std::string do_something() {
    return make_iso_timestamp(*clock_);
  }
};

// In tests
some_class t;
t.clock = fixed_clock(2020, 12, 23, 11, 22);
ASSERT_EQ("2020-12-23T11:22", t.do_something());


Я уже молчу об отдельном квесте: "напечатай мне время в ISO с наносекундами". Почему-то в комитете не подумали, что это кому-то может быть нужно.

Дубинкой бы их всех там надо пару раз по голове стукнуть.
Sapienti sat!
Re: Ненависть к std::chrono
От: vopl Россия  
Дата: 28.12.20 11:46
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Скажите, ну вот какой пиииииии в комитете не догадался сделать так, чтобы часы можно было вызывать через виртуальный метод?!?


У разных часов разные временные пространства. Чтобы их оформить виртуальными методами — надо иметь некое общее пространство времени. Такового не придумали... А предложи интерфейс часов с виртуальными методами, как бы это могло выглядеть на твой взгляд?
Re[2]: Ненависть к std::chrono
От: Cyberax Марс  
Дата: 28.12.20 12:22
Оценка:
Здравствуйте, vopl, Вы писали:

C>>Скажите, ну вот какой пиииииии в комитете не догадался сделать так, чтобы часы можно было вызывать через виртуальный метод?!?

V>У разных часов разные временные пространства. Чтобы их оформить виртуальными методами — надо иметь некое общее пространство времени. Такового не придумали... А предложи интерфейс часов с виртуальными методами, как бы это могло выглядеть на твой взгляд?
Вот так:
    struct timestamp_t {
        int64_t epoch_seconds;
        uint32_t nanos;
    };

    class clock_t
    {
    public:
        virtual ~clock_t() = default;
        virtual timestamp_t now() const;
    };

Всё, вопрос закрыт. Этот код решает проблемы с временим на ближайшие 200 миллиардов лет, с точностью до наносекунд.

Если хочется мастурбировать на шаблоны, и теоретические потребности поддержки разных эпох, то ну сделайте так:
template<class Timespace> struct timestamp_t {
  int64_t epoch_seconds;
  uint32_t nanos;
};

template<class Timespace> class clock_t    {
  public:
    virtual ~clock_t() = default;
    virtual timestamp_t<Timespace> now() const;
};

Т.е. чтобы нельзя было случайно присвоить две отметки времени с разными эпохами.

Но даже это тупо не нужно. Все давно стандартизовались на Unix-эпохе. При необходимости она тривиально преобразуется в любую другую простым прибавлением константы.
Sapienti sat!
Re[3]: Ненависть к std::chrono
От: vopl Россия  
Дата: 28.12.20 12:34
Оценка: :))
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, vopl, Вы писали:


C>>>Скажите, ну вот какой пиииииии в комитете не догадался сделать так, чтобы часы можно было вызывать через виртуальный метод?!?

V>>У разных часов разные временные пространства. Чтобы их оформить виртуальными методами — надо иметь некое общее пространство времени. Такового не придумали... А предложи интерфейс часов с виртуальными методами, как бы это могло выглядеть на твой взгляд?
C>Вот так:
C>
C>    struct timestamp_t {
C>        int64_t epoch_seconds;
C>        uint32_t nanos;
C>    };

C>    class clock_t
C>    {
C>    public:
C>        virtual ~clock_t() = default;
C>        virtual timestamp_t now() const;
C>    };
C>

C>Всё, вопрос закрыт. Этот код решает проблемы с временим на ближайшие 200 миллиардов лет, с точностью до наносекунд.

Ну, если вопрос закрыт, то круто, конечно . Все мосты к обсуждению, насколько я понял, отрезаны, сопротивление бесполезно ... А зачем это пихать в стандарт? Сделай себе свой clock_t&Co. и пользуй на здоровье?
Re[4]: Ненависть к std::chrono
От: Cyberax Марс  
Дата: 28.12.20 12:42
Оценка:
Здравствуйте, vopl, Вы писали:

C>>Всё, вопрос закрыт. Этот код решает проблемы с временим на ближайшие 200 миллиардов лет, с точностью до наносекунд.

V>Ну, если вопрос закрыт, то круто, конечно . Все мосты к обсуждению, насколько я понял, отрезаны, сопротивление бесполезно ... А зачем это пихать в стандарт? Сделай себе свой clock_t&Co. и пользуй на здоровье?
То есть "зачем"? Чтобы не писать каждый раз своё. И да, видимо для стандартизаторов С++ простота является чем-то недостижмым.

И ладно бы это было бы чем-то сверхумным, так ведь такой подход уже много лет использует Java, C#, Go и куча других языков.
Sapienti sat!
Re[5]: Ненависть к std::chrono
От: vopl Россия  
Дата: 28.12.20 12:57
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, vopl, Вы писали:


C>>>Всё, вопрос закрыт. Этот код решает проблемы с временим на ближайшие 200 миллиардов лет, с точностью до наносекунд.

V>>Ну, если вопрос закрыт, то круто, конечно . Все мосты к обсуждению, насколько я понял, отрезаны, сопротивление бесполезно ... А зачем это пихать в стандарт? Сделай себе свой clock_t&Co. и пользуй на здоровье?
C>То есть "зачем"? Чтобы я не писал каждый раз своё. И да, видимо для стандартизаторов С++ простота является чем-то недостижмым.
Подправил чуть. Не благодари.

C>И ладно бы это было бы чем-то сверхумным, так ведь такой подход уже много лет использует Java, C#, Go и куча других языков.

Хм.. покажи на примере C#, где там наносекунды есть? И 200 миллиардов лет?
Re[5]: Ненависть к std::chrono
От: vopl Россия  
Дата: 28.12.20 13:02
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, vopl, Вы писали:


C>>>Всё, вопрос закрыт. Этот код решает проблемы с временим на ближайшие 200 миллиардов лет, с точностью до наносекунд.

V>>Ну, если вопрос закрыт, то круто, конечно . Все мосты к обсуждению, насколько я понял, отрезаны, сопротивление бесполезно ... А зачем это пихать в стандарт? Сделай себе свой clock_t&Co. и пользуй на здоровье?
C>То есть "зачем"? Чтобы не писать каждый раз своё. И да, видимо для стандартизаторов С++ простота является чем-то недостижмым.

C>И ладно бы это было бы чем-то сверхумным, так ведь такой подход уже много лет использует Java, C#, Go и куча других языков.


Покажи, где в Go 200 миллиардов лет? Было бы справедливо к Go тоже организовать ненависть?
Re[5]: Ненависть к std::chrono
От: vopl Россия  
Дата: 28.12.20 13:18
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, vopl, Вы писали:


C>>>Всё, вопрос закрыт. Этот код решает проблемы с временим на ближайшие 200 миллиардов лет, с точностью до наносекунд.

V>>Ну, если вопрос закрыт, то круто, конечно . Все мосты к обсуждению, насколько я понял, отрезаны, сопротивление бесполезно ... А зачем это пихать в стандарт? Сделай себе свой clock_t&Co. и пользуй на здоровье?
C>То есть "зачем"? Чтобы не писать каждый раз своё. И да, видимо для стандартизаторов С++ простота является чем-то недостижмым.

C>И ладно бы это было бы чем-то сверхумным, так ведь такой подход уже много лет использует Java, C#, Go и куча других языков.


И в Java похоже тоже нету наносекундной точности для 200 миллиардов лет.. По крайней мере я такого не нашел, но может плохо искал . Покажи?
Re[6]: Ненависть к std::chrono
От: Cyberax Марс  
Дата: 28.12.20 14:20
Оценка:
Здравствуйте, vopl, Вы писали:

C>>То есть "зачем"? Чтобы я не писал каждый раз своё. И да, видимо для стандартизаторов С++ простота является чем-то недостижмым.

V>Подправил чуть. Не благодари.
И не только я, а все остальные, кому нужна правильная работа с датами.

C>>И ладно бы это было бы чем-то сверхумным, так ведь такой подход уже много лет использует Java, C#, Go и куча других языков.

V>Хм.. покажи на примере C#, где там наносекунды есть? И 200 миллиардов лет?
https://docs.microsoft.com/en-us/dotnet/api/system.datetime.ticks?view=net-5.0 — разрешение 100 наносекунд, диапазон в 50 тысяч лет.
Sapienti sat!
Re[6]: Ненависть к std::chrono
От: Cyberax Марс  
Дата: 28.12.20 14:22
Оценка:
Здравствуйте, vopl, Вы писали:

C>>И ладно бы это было бы чем-то сверхумным, так ведь такой подход уже много лет использует Java, C#, Go и куча других языков.

V>И в Java похоже тоже нету наносекундной точности для 200 миллиардов лет.. По крайней мере я такого не нашел, но может плохо искал . Покажи?
https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html
    The maximum supported Instant, '1000000000-12-31T23:59:59.999999999Z'.
    The minimum supported Instant, '-1000000000-01-01T00:00Z'.

Они решили, видимо, ограничить всего одним миллиардом лет.
Sapienti sat!
Re[6]: Ненависть к std::chrono
От: Cyberax Марс  
Дата: 28.12.20 14:28
Оценка: :)
Здравствуйте, vopl, Вы писали:

C>>И ладно бы это было бы чем-то сверхумным, так ведь такой подход уже много лет использует Java, C#, Go и куча других языков.

V>Покажи, где в Go 200 миллиардов лет? Было бы справедливо к Go тоже организовать ненависть?
В Go — наносекунды (а timestamp — просто псевдоним для int64). Это плохое решение, так как теряет диапазон. Но хорошее с практической точки зрения — API очень простой (можно делать так "time.Add(10*time.Second)").
Sapienti sat!
Re[7]: Ненависть к std::chrono
От: vopl Россия  
Дата: 28.12.20 14:28
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, vopl, Вы писали:


C>>>То есть "зачем"? Чтобы я не писал каждый раз своё. И да, видимо для стандартизаторов С++ простота является чем-то недостижмым.

V>>Подправил чуть. Не благодари.
C>И не только я, а все остальные, кому нужна правильная работа с датами.

C>>>И ладно бы это было бы чем-то сверхумным, так ведь такой подход уже много лет использует Java, C#, Go и куча других языков.

V>>Хм.. покажи на примере C#, где там наносекунды есть? И 200 миллиардов лет?
C>https://docs.microsoft.com/en-us/dotnet/api/system.datetime.ticks?view=net-5.0 — разрешение 100 наносекунд, диапазон в 50 тысяч лет.

То есть, наносекундной точности нет и диапазона в 200 миллиардов лет тоже нет. То есть, Сишарп не предоставляет "правильную работу с датами". Выписываем Сишарпу ненависть?
Re[8]: Ненависть к std::chrono
От: Cyberax Марс  
Дата: 28.12.20 14:32
Оценка: +2 :)
Здравствуйте, vopl, Вы писали:

C>>https://docs.microsoft.com/en-us/dotnet/api/system.datetime.ticks?view=net-5.0 — разрешение 100 наносекунд, диапазон в 50 тысяч лет.

V>То есть, наносекундной точности нет и диапазона в 200 миллиардов лет тоже нет. То есть, Сишарп не предоставляет "правильную работу с датами". Выписываем Сишарпу ненависть?
100нс — достаточная для большинства практических целей точность, так что нет. Диапазон тоже достаточен.

С# далеко до маразма С++ (и защищающих его!), который ОДНОВРЕМЕННО умудрился потерять гарантии по диапазону значений и точности. Стандартный комитет, видимо, очень долго работал над этим достижением. Но им это удалось!
Sapienti sat!
Re[7]: Ненависть к std::chrono
От: vopl Россия  
Дата: 28.12.20 14:32
Оценка: +1
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, vopl, Вы писали:


C>>>И ладно бы это было бы чем-то сверхумным, так ведь такой подход уже много лет использует Java, C#, Go и куча других языков.

V>>Покажи, где в Go 200 миллиардов лет? Было бы справедливо к Go тоже организовать ненависть?
C>В Go — наносекунды (а timestamp — просто псевдоним для int64). Это плохое решение, так как теряет диапазон. Но хорошее с практической точки зрения — API очень простой (можно делать так "time.Add(10*time.Second)").

То есть, в Go та же самая сетка времени что и в плюсном chrono::nanoseconds с 64-битным счетчиком. Выписываем ему ненависть?
Re[7]: Ненависть к std::chrono
От: vopl Россия  
Дата: 28.12.20 14:39
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, vopl, Вы писали:


C>>>И ладно бы это было бы чем-то сверхумным, так ведь такой подход уже много лет использует Java, C#, Go и куча других языков.

V>>И в Java похоже тоже нету наносекундной точности для 200 миллиардов лет.. По крайней мере я такого не нашел, но может плохо искал . Покажи?
C>https://docs.oracle.com/javase/8/docs/api/java/time/Instant.html
C>
C>    The maximum supported Instant, '1000000000-12-31T23:59:59.999999999Z'.
C>    The minimum supported Instant, '-1000000000-01-01T00:00Z'.
C>

C>Они решили, видимо, ограничить всего одним миллиардом лет.

Ок, достаточно близко к тому что ты хотел. К Java ненависть не выписываем.
Re[9]: Ненависть к std::chrono
От: vopl Россия  
Дата: 28.12.20 14:51
Оценка: +1
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, vopl, Вы писали:


C>>>https://docs.microsoft.com/en-us/dotnet/api/system.datetime.ticks?view=net-5.0 — разрешение 100 наносекунд, диапазон в 50 тысяч лет.

V>>То есть, наносекундной точности нет и диапазона в 200 миллиардов лет тоже нет. То есть, Сишарп не предоставляет "правильную работу с датами". Выписываем Сишарпу ненависть?
C>100нс — достаточная для большинства практических целей точность, так что нет. Диапазон тоже достаточен.

Вопрос же был закрыт со следующими требованиями: наносекундная точность, диапазон 200 миллиардов лет. Вспомни:
C>> Всё, вопрос закрыт. Этот код решает проблемы с временим на ближайшие 200 миллиардов лет, с точностью до наносекунд.
Хвост виляет собакой? Двойные стандарты? Кумовство? Своим можно? А нас то за что?
Re[8]: Ненависть к std::chrono
От: Cyberax Марс  
Дата: 28.12.20 14:55
Оценка: +1 -1
Здравствуйте, vopl, Вы писали:

C>>В Go — наносекунды (а timestamp — просто псевдоним для int64). Это плохое решение, так как теряет диапазон. Но хорошее с практической точки зрения — API очень простой (можно делать так "time.Add(10*time.Second)").

V>То есть, в Go та же самая сетка времени что и в плюсном chrono::nanoseconds с 64-битным счетчиком. Выписываем ему ненависть?
Вот так выглядит печать времени с наносекундами в Go:
package main
import "time"
func main() {
  tm := time.Now()
  println(tm.Format("2006-01-02T15:04:05.999999999Z07:00"))
  // Или:
  println(tm.Format(time.RFC3339Nano))
}

Всё полностью запускаемо: https://play.golang.org/p/ZQqlZodi-up

Метод формата даты — вообще гениален. Единственный минус — неудачно выбранная эталонная дата.

А теперь то же самое для C++:
#include <iostream>
#include <sstream>
#include <chrono>
#include <iomanip>

int main()
{
  auto now = std::chrono::system_clock::now();
  auto epoch_seconds = std::chrono::system_clock::to_time_t(now); 

  std::stringstream stream;
  stream << std::put_time(gmtime(&epoch_seconds), "%FT%T");
  auto truncated = std::chrono::system_clock::from_time_t(epoch_seconds);
  auto delta_ns = std::chrono::duration_cast<std::chrono::nanoseconds>(now - truncated).count();
  // And append this to the output stream as fractional seconds
  // e.g. 2016-08-30T08:18:51.867479
  stream << "." << std::fixed << std::setw(9) << std::setfill('0') << delta_ns;
 
  std::cout << stream.str() << std::endl;
}


Кретиноиды из комитета добавили возможность печати даты в китайских символах (四十五 вместо 45), но не додумались добавить формат для наносекунд. Да что там, они даже для миллисекунд формат не добавили.

Эпичный фэйл.
Sapienti sat!
Re[9]: Ненависть к std::chrono
От: vopl Россия  
Дата: 28.12.20 14:59
Оценка:
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, vopl, Вы писали:


C>>>В Go — наносекунды (а timestamp — просто псевдоним для int64). Это плохое решение, так как теряет диапазон. Но хорошее с практической точки зрения — API очень простой (можно делать так "time.Add(10*time.Second)").

V>>То есть, в Go та же самая сетка времени что и в плюсном chrono::nanoseconds с 64-битным счетчиком. Выписываем ему ненависть?
C>Вот так выглядит печать времени с наносекундами в Go:

Не надо вилять. 200 миллиардов лет есть? Нет. Выписываем ненависть. А тебе — кубок вилятора.
Re[10]: Ненависть к std::chrono
От: Cyberax Марс  
Дата: 28.12.20 15:07
Оценка:
Здравствуйте, vopl, Вы писали:

C>>Вот так выглядит печать времени с наносекундами в Go:

V>Не надо вилять. 200 миллиардов лет есть? Нет. Выписываем ненависть. А тебе — кубок вилятора.
Фича в том, что для Go взамен 200 миллиардов лет есть очень красивый API. Это вполне себе неплохой инженерный компромис.

В C# — аналогичная история. Только они пожертвовали точностью для того, чтобы уметь представлять даты из практического диапазона (9999AD до 9999BC).

Но в С++ комитет абсолютно и непреклонно бескомпромисный. Так что они пожертвовали ВСЕМ одновременно. Так что в С++ нет ни красивого API, ни интервала в миллиарды лет.
Sapienti sat!
Re[11]: Ненависть к std::chrono
От: vopl Россия  
Дата: 28.12.20 15:35
Оценка: +1
Здравствуйте, Cyberax, Вы писали:

C>Здравствуйте, vopl, Вы писали:


C>>>Вот так выглядит печать времени с наносекундами в Go:

V>>Не надо вилять. 200 миллиардов лет есть? Нет. Выписываем ненависть. А тебе — кубок вилятора.
C>Фича в том, что для Go взамен 200 миллиардов лет есть очень красивый API. Это вполне себе неплохой инженерный компромис.

Всё, вопрос закрыт. Этот код решает проблемы с временим на ближайшие 200 миллиардов лет, с точностью до наносекунд.
Всё, вопрос закрыт. Этот код решает проблемы потому что красивый API.

C>В C# — аналогичная история. Только они пожертвовали точностью для того, чтобы уметь представлять даты из практического диапазона (9999AD до 9999BC).


Всё, вопрос закрыт. Этот код решает проблемы с временим на ближайшие 200 миллиардов лет, с точностью до наносекунд.
Всё, вопрос закрыт. Этот код решает проблемы потому что тоже самое, да еще и практический диапазон (9999AD до 9999BC).

Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.