当前位置: 首页 > news >正文

彩票网站开发租用久久建筑网资料全吗

彩票网站开发租用,久久建筑网资料全吗,写文章在哪里发表挣钱,产品开发设计流程图在开发高性能的C应用程序时,一个高效的日志框架是不可或缺的。G3log是一个开源的日志库,以其高性能和易于使用著称,特别适用于嵌入式Linux环境。本文将详细介绍G3log的主要特性和如何在嵌入式Linux平台上进行交叉编译。 G3log介绍 G3log 是一…

在开发高性能的C++应用程序时,一个高效的日志框架是不可或缺的。G3log是一个开源的日志库,以其高性能和易于使用著称,特别适用于嵌入式Linux环境。本文将详细介绍G3log的主要特性和如何在嵌入式Linux平台上进行交叉编译。

G3log介绍

G3log 是一个开源、支持跨平台的异步 C++ 日志框架,支持自定义日志格式。基于 g2log 构建,提升了性能,支持自定义格式。它继承了g2log的优点,如轻量级、易用性及出色的性能表现,并在此基础上进行了大胆革新。

项目链接:https://github.com/KjellKod/g3log

G3log 主要特性

G3log 是一个基于g2log开发的开源异步C++日志框架,具备跨平台特性,允许用户根据需求定制日志格式。以下是G3log的主要特性:

  • 日志和契约式设计框架:G3log提供了一套完整的日志系统和契约式编程支持,便于开发者编写可维护、可扩展的代码。
  • 异步调用:相较于传统的同步日志记录方式,G3log采用异步机制,使得日志记录不会阻塞主线程,从而提升程序的响应速度。
  • 线程安全:在多线程环境下,G3log通过巧妙的内部机制保证了线程安全,避免了数据竞争和死锁等问题。
  • 队列式日志:G3log使用队列存储日志信息,确保日志记录过程的高效稳定。
  • 捕获和记录SIGSEGV等信号:G3log能够捕获并记录严重的运行时信号,如SIGSEGV,并在Linux/OSX上生成堆栈跟踪信息,方便开发者进行调试。
  • 跨平台支持:G3log支持Windows, Linux 和 OSX三个操作系统,能够满足不同开发环境的需求。
  • 多种编译器支持:G3log可以使用Visual Studio 2013, Clang 和 GCC4.7 进行构建,便于不同环境下的开发工作。

性能对比

G3log与log4cplus进行了在Linux和Windows环境下的日志记录性能对比测试。结果显示,在这两种操作系统中,G3log明显表现出了更快的日志记录速度。这得益于G3log的异步处理机制和高效的内部实现。

简单地对log4cplus和g3log的性能做了测试,打印1百万条日志信息所需时间如下:

框架模式LinuxWindows
log4cplus同步4s6s
log4cplus异步1.9s64s
G3log异步2.3s待做

从表中可以看出,在Linux环境下,G3log的异步日志记录性能优于log4cplus的异步模式;而Windows环境下的同步日志记录性能,G3log也优于log4cplus。

虽然还有个spdlog号称全球最快,但是g3log作者对spdlog的对比,仅供参考:
https://kjellkod.wordpress.com/2015/06/30/the-worlds-fastest-logger-vs-g3log/

https://moodycamel.com/blog/2014/a-fast-general-purpose-lock-free-queue-for-c++

g3log的测试程序如下:

#include <string>
#include <iostream>
#include <memory>
#include <g3log/g3log.hpp>
#include <g3log/logworker.hpp>std::string path_to_log_file = "./";
std::string log_file = "g3logfile";std::unique_ptr<g3::LogWorker> worker;void log_init()
{worker = g3::LogWorker::createLogWorker();auto handle = worker->addDefaultLogger(log_file, path_to_log_file);g3::initializeLogging(worker.get());
}void log_shutdown()
{g3::internal::shutDownLogging();
}int main(int argc, char* argv[])
{log_init();for (int i = 0; i < 1000000; i++){// use LOGF which like printfLOGF(INFO, "logging test %d", i);}log_shutdown();return 0;
}

编译测试:

g++ -std=c++14 -Wall -O3 -I/home/yang/usr/lib/g3log/include -L/home/yang/usr/lib/g3log/lib -lg3logger main.cc -o main

G3log在多线程编程中的应用

线程安全的保证

在线程编程中,线程安全是至关重要的。G3log在设计之初便将线程安全作为核心考量之一,采用高效的锁机制来隔离可能引起冲突的操作。即使在高并发环境下,G3log也能确保日志记录过程的稳定与可靠。这种设计极大地简化了多线程编程中的复杂度,为软件的整体质量提供了坚实的保障。

异步调用在多线程中的实践

异步调用是G3log的一大亮点。在传统同步模式下,每当应用程序需要记录一条日志时,主线程必须暂停当前任务,等待日志写入完成后才能继续执行。这种方式虽然简单直接,但在处理大量并发请求时却显得力不从心。G3log通过引入异步机制,使得日志记录变成了一项非阻塞性的工作。具体来说,当某个线程产生日志信息时,它只需将这些信息暂时存放在一个缓冲区中,而无需等待实际写入磁盘的过程完成。与此同时,G3log会在后台独立运行一个或多个线程,专门负责将缓冲区中的数据持久化到文件系统中。这样一来,不仅极大地提升了程序的响应速度,还有效避免了因日志操作导致的性能瓶颈问题。

代码示例:多线程环境下的G3log使用

为了更直观地展示G3log在多线程环境中的应用效果,下面将通过一个简单的示例来进行说明。假设你正在开发一个需要处理大量并发请求的服务器端应用,并希望利用G3log来记录各个线程的活动情况。

#include <g3log/g3log.hpp>
#include <g3log/logworker.hpp>
#include <thread>
#include <vector>void threadFunction(int id) {// 每个线程记录一条日志LOG(INFO) << "Thread " << id << " is running.";
}int main() {// 初始化日志系统g3::initialize_logging(g3::logworker::initLogWorker());std::vector<std::thread> threads;for (int i = 0; i < 10; ++i) {threads.emplace_back(threadFunction, i);}// 等待所有线程结束for (auto& t : threads) {t.join();}// 清理日志系统g3::shutdown_logging();return 0;
}

在这个例子中,我们创建了一个包含10个线程的集合,并为每个线程分配了一个独立的任务——记录一条包含线程编号的日志信息。通过观察最终生成的日志文件,我们可以清楚地看到所有线程的执行顺序及状态变化,这对于调试多线程程序来说是非常有帮助的。此外,由于G3log具备优秀的异步处理能力,上述代码在实际运行时并不会出现明显的延迟现象,充分体现了其在高并发场景下的优越性能。

在嵌入式Linux上的移植

准备交叉编译工具链

首先,我们需要准备交叉编译工具链。这里以ARM和RISC-V架构为例,创建一个toolchain.cmake文件:

# 交叉编译工具链配置文件
# 用于嵌入式Linux系统和RISC-V MCU的交叉编译# 设置系统名称
set(CMAKE_SYSTEM_NAME Linux)# 设置处理器架构变量,可以通过命令行参数传入
# 例如: cmake -DTARGET_ARCH=arm ..
if(NOT DEFINED TARGET_ARCH)set(TARGET_ARCH "arm" CACHE STRING "Target architecture (arm or riscv)")
endif()# 设置ARM工具链路径
set(ARM_TOOLCHAIN_PATH "/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi")
# 设置RISC-V工具链路径
set(RISCV_TOOLCHAIN_PATH "/opt/tronlong/tina5.0_v1.0/rtos/lichee/rtos/tools/riscv64-elf-x86_64-20201104")# 根据目标架构设置主工具链
if(${TARGET_ARCH} STREQUAL "arm")# ARM Linux工具链配置set(CMAKE_C_COMPILER ${ARM_TOOLCHAIN_PATH}/arm-poky-linux-gnueabi-gcc)set(CMAKE_CXX_COMPILER ${ARM_TOOLCHAIN_PATH}/arm-poky-linux-gnueabi-g++)set(CMAKE_FIND_ROOT_PATH /opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi/)set(CMAKE_SYSTEM_PROCESSOR arm)# 设置额外的编译标志set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=armv7-a -mfloat-abi=hard -mfpu=neon" CACHE STRING "" FORCE)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=armv7-a -mfloat-abi=hard -mfpu=neon" CACHE STRING "" FORCE)# 设置链接器set(CMAKE_LINKER ${CMAKE_C_COMPILER})set(CMAKE_AR ${ARM_TOOLCHAIN_PATH}/arm-poky-linux-gnueabi-ar)set(CMAKE_RANLIB ${ARM_TOOLCHAIN_PATH}/arm-poky-linux-gnueabi-ranlib)elseif(${TARGET_ARCH} STREQUAL "riscv")# RISC-V工具链配置 (C906核心)set(CMAKE_C_COMPILER ${RISCV_TOOLCHAIN_PATH}/bin/riscv64-unknown-elf-gcc)set(CMAKE_CXX_COMPILER ${RISCV_TOOLCHAIN_PATH}/bin/riscv64-unknown-elf-g++)set(CMAKE_FIND_ROOT_PATH ${RISCV_TOOLCHAIN_PATH}/riscv64-unknown-elf)set(CMAKE_SYSTEM_PROCESSOR riscv)# 设置RISC-V特定的编译标志 (C906核心)set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -march=rv64gcv0p7 -mabi=lp64d" CACHE STRING "" FORCE)set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -march=rv64gcv0p7 -mabi=lp64d" CACHE STRING "" FORCE)# 设置链接器set(CMAKE_LINKER ${CMAKE_C_COMPILER})set(CMAKE_AR ${RISCV_TOOLCHAIN_PATH}/bin/riscv64-unknown-elf-ar)set(CMAKE_RANLIB ${RISCV_TOOLCHAIN_PATH}/bin/riscv64-unknown-elf-ranlib)else()message(FATAL_ERROR "不支持的目标架构: ${TARGET_ARCH}. 请使用 'arm' 或 'riscv'")
endif()# 设置查找规则
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)# 禁用系统库路径
set(CMAKE_SKIP_RPATH TRUE)# 设置交叉编译环境的库和头文件搜索路径
set(CMAKE_SYSROOT ${CMAKE_FIND_ROOT_PATH}) 

交叉编译G3log

接下来,从GitHub下载G3log的源码。注意,由于我的GCC版本为5.3,不支持C++17,因此需要下载1.3.4版本的G3log。

下载源码后,在根目录下创建一个build目录,进入build目录并执行以下指令:

cmake ../ \-DCMAKE_TOOLCHAIN_FILE=../toolchain.cmake \-DTARGET_ARCH=arm \-DADD_G3LOG_UNIT_TEST=OFF \-DG3_SHARED_LIB=ON \-DUSE_DYNAMIC_LOGGING_LEVELS=OFF \-DENABLE_FATAL_SIGNALHANDLING=ON \-DCMAKE_INSTALL_PREFIX=${HOME}/arm_install

执行完上述指令后,分别运行makemake install命令,即可完成G3log在ARM架构下的交叉编译和安装。
在这里插入图片描述

G3log使用举例

以下是G3log的基本使用示例:

#include <iostream>
#include <g3log/g3log.hpp>
#include <g3log/logworker.hpp>using namespace std;string path_to_log_file = "/tmp/";
string log_file = "g3log_file";std::unique_ptr<g3::LogWorker> worker;void log_init()
{worker = g3::LogWorker::createLogWorker();auto handle = worker->addDefaultLogger(log_file, path_to_log_file);g3::initializeLogging(worker.get());
}void log_shutdown()
{g3::internal::shutDownLogging();
}int main(int argc, char* argv[])
{log_init();// use LOGF which like printfLOGF(INFO, "Hi log %d", 123);LOGF(WARNING, "Printf-style syntax is also %s", "available”);// use LOG wich like std::coutLOG(INFO) << "Hi " << "LOG";log_shutdown();return 0;
}

在这个简单的示例中,我们首先初始化了日志系统,并指定了日志文件的存储目录。之后,通过LOG宏记录了不同级别的日志信息,包括INFO、WARNING、DEBUG和ERROR。

总结

通过对G3log的深入探讨,我们不仅领略了这款日志框架在异步调用、跨平台支持以及线程安全等方面展现出的强大功能,还通过一系列实用的代码示例,直观地感受到了其在实际开发中的便捷与高效。G3log凭借其卓越的性能表现和灵活的配置选项,为C++开发者提供了一个理想的日志解决方案。无论你是初学者还是经验丰富的专业人士,都能够从中受益匪浅。未来,随着技术的不断进步与应用场景的日益丰富,相信G3log将继续发挥重要作用,助力更多项目实现高效、稳定的目标。

其他资源

https://www.open-open.com/lib/view/open1408677978459.html

https://www.showapi.com/news/article/66ec3f9f4ddd79f11a0fe3fb

https://blog.csdn.net/wqfhenanxc/article/details/88892996

http://www.dtcms.com/a/426236.html

相关文章:

  • 网站后台登录界面代码为什么选用美食做网站主页
  • 南昌网站建设报价建筑室内设计网
  • 商城网站合作协议兼职写好评15元一条
  • 甘肃省城乡建设局网站模板网站做外贸好不好
  • jsp网站开发中js的问题怎么做网络推广赚佣金
  • 聊城手机网站建设国际摄影网
  • 如何建设自己的php网站专门app软件开发公司
  • 南昌企业建站系统js搜索网站开发
  • 服务器 网站打开慢不懂代码可以做网站吗
  • 网站群建设论文网站主题类型
  • 网站建设项目签约仪式举行辽宁城乡建设部网站
  • 徐州网站关键词推广盛泽做网站
  • 中国造价工程建设管理协会网站网页设计速成培训
  • 太原网站建设推广电商运营自学网站
  • 做防伪的网站网站开发先写后端先写前端
  • 企业网站建设方案有那些重装wordpress图片不见
  • wordpress网站导入网站访问速度查询
  • 食品品牌策划方案seo网站优化策划书
  • 网站配色案例分析wordpress 外贸 开发
  • 做seo还要需要做网站吗网站域名空间费用
  • 判断网站免费制作图片生成器
  • 公司网站被抄袭徐汇集团网站建设
  • 遂平网站建设建设银行青海省分行招聘网站
  • 嘉兴企业网站seo一个月赚多少钱
  • 安阳网站怎么优化巩义网站建设优化公司
  • 网站开发工程师和软件工程凡客网站官网
  • 金融社区类网站建设j2ee网站开发免费教程
  • 怎么往网站换图片做本地信息网站要注册什么类型公司
  • 东莞网站建设优化网站服务
  • 做网站除了域名还用什么汉网可以建设网站不