连接到web时,以下程序将给定的std::chrono::system_clock::time_point
转换为字符串,需要大量的1s32ms
才能完成。但是,如果我的机器没有连接到网络,程序需要一个合理的54ms
。
#include "date/tz.h" // Howard Hinnant's date library
#include <chrono>
#include <iostream>
std::string tp2str(const std::chrono::system_clock::time_point &tp,
const std::string &tz) {
auto z = date::make_zoned(tz, tp);
return date::format("%Y-%m-%d %H:%M:%S %Z (%A)", z);
}
int main() {
const auto now = std::chrono::system_clock::now();
std::cout << tp2str(now, "US/Eastern") << std::endl;
}
在连接时检查探查器输出可以发现延迟是由于函数序列date::remote_version ... Curl_http_connect
造成的,该函数序列可能试图连接到远程web主机。
在仍然连接到网络的情况下调用date::make_zoned()
时,有没有办法防止这种行为?
Howard Hinnant的date
库的文档解释了remote_version()
,解释了它的用途以及如何关闭它
只有使用配置宏HAS_REMOTE_API==1编译时,以下函数才可用。使用此API需要链接到libcurl。AUTO_DOWNLOAD==1需要HAS_REMOTE_API==1。如果AUTO_DOWNLOAD==1且HAS_REMOTE_API==0,则编译时将通知您。如果HAS_REMOTE_API==1,则AUTO_DOWNLOAD默认为1,否则AUTO_DOWNLOAD默认为0。在Windows上,HAS_REMOTE_API默认为0。在其他任何地方,它都默认为1。这是因为除了Windows之外,libcurl在任何地方都预装了,但它适用于Windows。
USE_OS_TZDB==1不提供这些功能。
很可能,您希望将编译时定义USE_OS_TZDB=1
添加到构建中。
如果有人对CMakeLists.txt
感兴趣,以下是对我有效的方法:
cmake_minimum_required(VERSION 3.22)
project(date_test)
cmake_policy(SET CMP0077 NEW)
include( FetchContent )
FetchContent_Declare( date
GIT_REPOSITORY https://github.com/HowardHinnant/date.git
GIT_TAG v3.0.1
)
set( BUILD_TZ_LIB ON CACHE INTERNAL "build/install of TZ library")
set( USE_SYSTEM_TZ_DB ON CACHE INTERNAL "Use the operating system's timezone database" )
FetchContent_MakeAvailable(date)
set(CMAKE_CXX_STANDARD 20)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries (${PROJECT_NAME} PRIVATE date-tz)
注意日期回购的CMakeLists.txt
中设置的BUILD_TZ_LIB
和USE_SYSTEM_TZ_DB
cmake
变量的覆盖。