最近要设计一个C++矩阵类,涉及到矩阵元素的存储。根据矩阵元素的存储,通常分为行主序和列主序。
行主序是指以行为优先单位,在内存中逐行存储;
列主序是指以列为优先单位,在内存中逐列存储。
行主序与列主序的代码实现有一定的惯例,表现如下:
- 行主序以二维数组存储,列主序以一维数组存储;
- 行主序以二维数组方式命名初始化参数,列主序以一维数组方式命名初始化参数;
- 行主序以行为单位初始化,列主序以列为单位初始化;
参考链接
- OpenGL中矩阵的行主序与列主序,by 天律界中子.
最近要设计一个C++矩阵类,涉及到矩阵元素的存储。根据矩阵元素的存储,通常分为行主序和列主序。
行主序是指以行为优先单位,在内存中逐行存储;
列主序是指以列为优先单位,在内存中逐列存储。
行主序与列主序的代码实现有一定的惯例,表现如下:
在Windows平台使用VS2017社区版将开源数学库GSL编译链接成DLL后,使用官方示例测试其插值函数。在编译链接该示例过程中报
LNK2001: unresolved external symbol _gsl_interp_cspline
的错误。
解决方法如下,在示例开始处定义如下宏即可。
#define GSL_DLL
完整可运行示例如下:
1 | #define GSL_DLL |
近年来,企事业单位IT建设如火如荼,取得了很多的成果,极大地提高了企事业单位的工作效率。但同时企事业IT建设中存在的数据管理问题、业务管理问题不容忽视。在企事业单位IT建设的早期,项目之间没有整体规划,缺乏统一管理,造成数据孤岛、数据标准化缺失、数据存储杂乱、数据使用泛滥等数据管理问题,同时业务方面也存在重复建设、人亡政息、部门分割、多头管理等业务管理问题。中台架构即是针对上述问题,对企事业IT建设的涅槃和重生。
在传统企业IT架构中,通常分成前台和后台。前台即包括各种和用户直接交互的界面,比如web页面、手机app;也包括服务端各种实时响应用户请求的业务逻辑,比如商品查询、订单系统等等。而后台并不直接面向用户,而是面向运营人员的配置管理系统,比如商品管理、物流管理、结算管理。后台为前台提供了一些简单的配置。
在企业竞争不够激烈时,这种IT架构能够满足用户需求,虽然易造成数据冗余、数据孤岛、数据杂乱等问题。而今天随着互联网的蓬勃发展,企业竞争越来越激烈,用户也越来越挑剔。只有以用户为中心,快速影响用户的需求,不断迭代和试错,才能让企事业在竞争当中立于不败,才能更加满足用户的需求。于是中台架构应运而生。
中台架构本质上是对传统前后台IT架构的重构,尤其是后台的重构。在传统的IT架构中,通常会遇到如下两类问题:
这两类问题,在软件开发领域,有专门的名称,叫做“重复造轮子”和“烟囱式架构”。中台的诞生即为了避免“重复造轮子”的尴尬和“烟囱式架构”的无序发展。
中台是真正为前台而生的平台(可以是技术平台,业务能力甚至是组织机构),它存在的唯一目的就是更好的服务前台规模化创新,进而更好的响应服务引领用户,使企业真正做到自身能力与用户需求的持续对接。
中台就像是在前台与后台之间添加的⼀组“变速⻮轮”,将前台与后台的速率进行匹配,是前台与后台的桥梁。它为前台而生,易于前台使用,将后台资源顺滑流向用户,响应用户。
中台的存在价值是为它的客户服务,比如业务中台和数据中台要快速响应前台应用的需求。中台建设的价值,在于帮助企业搭建更加适应企业数字化转型的全新IT架构。或者说,中台架构本身就是企业全新IT架构的核心内容和骨干系统,让企业IT运营更加顺畅,更能帮助企业尝试新的商业模式,完成战略转型的目的。
根据功能和角色的不同,中台可分为:
魔方作为家喻户晓的益智玩具,由匈牙利建筑学教授暨雕塑家鲁比克·艾尔内于1974年发明,最初的名称叫Magic Cube[2],1980年Ideal Toys公司于贩售此玩具,并将名称改为Rubik’s Cube。下面简要介绍魔方复原的方法。
为了记录下复原、转乱的过程或公式的步骤,会用Singmaster符号来书写(由David Singmaster发明)。书写方式如下:
三阶魔方的总变化数是:
$${\displaystyle {\frac {8!\times 3^{8}\times 12!\times 2^{12}}{2\times 2\times 3}}=43,!252,!003,!274,!489,!856,!000\approx 4.33\times 10^{19}}$$
三阶魔方总变化数的算式是这样得来:
8个角块可以互换位置(${\displaystyle 8!}$),也可以旋转(3),但不能单独旋转一个角块,所以总共有${\displaystyle {\frac {8!\times 3^{8}}{3}}}$种变化状态。
12个边块可以互换位置($12!$),也可以翻转(2),但不能单独翻转一个边块(将两个面对调),也不能单独交换两边块,所以总共有${\displaystyle {\frac {12!\times 2^{12}}{2\times 2}}}$种变化状态。
所有的三阶魔方都可以在有限步数内复原,1982年,佛雷与辛马斯特合著的《魔方手册》定义任意的三阶魔方都可以保证最少n步复原,并称呼n为上帝的数字。在此书中,证明上帝的数字介于17~52之间。
1995年,瑞德证明上帝的数字介于20-29之间。2006年,雷杜用群论证明上界可改进为27。
2007年,计算机科学家古柏曼与他的学生用20台超级电脑花了8000个小时证明上界可改进为26。
2008年,Tomas Rokicki宣布证明了任何魔方可以在25步以内解开[22]。之后又改进为22步。
2010年,包括Tomas Rokicki和Morley Davidson等人的研究团队证明任意组合的魔方可以在20步内还原,现在上帝的数字正式定为20。
以白色面为例,说明魔方复原的简单方法。
第一步白色面的复原非常简单,分成两小步,如图1和图2所示。
白色面的还原比较简单,就不介绍具体步骤了。
第二步中间层的复原分成两种情况,如图3和图4所示。
第三步最后一层的还原遇到的情况很多,目前我也没有完全搞明白,下面简单介绍最后一层复原的步骤,但并不能保证一定能复原。
根据顶层状态,多次使用公式F R U R’ U’ F’,以形成顶部十字。
交换顶层边块,使其边缘颜色保持一致,如图6所示。
现在只剩下黄色的角落,将分两个步骤进行。首先,我们必须以定位它们,在下一步骤中定向它们。
此算法循环上面图像上顶层的角块,但标有“OK”的前右上角将保留在原位。
现在顶层角块都已定位,但角块颜色与周围面不一致,使用如图8所示算法一个一个旋转顶层角块。
首先在突出显示的右前方点,拿着你的手有一个不对准的黄色角落的立方体(见图8)。重复R’ D’ R D算法,直到这一块在它的地方与黄色贴纸。
只将一面向上转动,将另一个错误的黄色拐角移到突出显示的点,并重复R’ D’ R D算法,直到这个黄色面被解决。
移动其他未对齐的黄色边角,一个一个到标记的点,并做公式,直到所有的黄色角落都被解决。
将色向不对的两个角放在顶层左手边位置,用公式(R;U;R’;U;R;U2;R’;)(L’;U’;L;U’;L’;U2;L;)。
做一遍如果不对的话,就再做一遍就行了.
Eigen是用于线性代数的C ++模板库,包括矩阵,向量,数值求解器和相关算法。
从Eigen官网下载最新的Eigen版本。解压Eigen,然后使用Cmake进行配置并生成Visual Studio 15 2017的工程。打开解决方案,先生成ALL_BUILD工程,再生成INSTALL工程,则安装Eigen完毕。将在安装路径下生成Eigen的头文件。
当然也可以不编译安装,直接将Eigen源代码目录下的Eigen子目录复制到Include文件夹即可。
1 | #include <iostream> |
1 |
|
太阳位置是从地球表面观察时,太阳在天空中的位置,它是时间和地理位置两者的函数。计算给定地点和时间的太阳位置要经过下列三个步骤:
黄道坐标系是以黄道作基准平面的天球坐标系统,多用作研究太阳系天体运动情况之用。如图1所示。
黄道是由地球上观察太阳一年中在天球上的视运动所通过的路径,若以地球“不动”作参照的话就是太阳绕地球公转的轨道平面(黄道面)在天球上的投影。
黄道与天赤道相交于两点:春分点与秋分点(这两点称二分点);而黄道对应的两个几何极是北黄极(在天龙座)、与南黄极 (在剑鱼座)。
在黄道上与黄道平行的小圆称黄纬,符号β,以由黄道面向北黄极方向为正值(0°至90°),向南黄极方向则为负值。垂直黄道的经度称黄经,符号为λ,由春分点起由西向东量度(0°至360°)。像赤道坐标系中的赤经一样,以春分点做为黄经的起点。
此坐标系特别适合标示太阳系内天体的位置,大多数行星(水星和冥王星除外)与许多小行星轨道平面与黄道的倾角都很小,故其黄纬值(β)都不大。
太阳黄道坐标的近似计算方法如下:
先计算与格林尼治 2000.0年1月1日中午12:00(历元)相距的日数。如果你知道儒略日,则你的叙述会如下:
$$ n = \mathrm{JD} - 2451545.0 $$
以光行差修正太阳的平黄经,如下:
$$ L = 280.460^\circ + 0.9856474^\circ n $$
太阳的平近点角(实际上,是地球在轨道上绕着太阳,但是假设太阳绕着地球比较方便)如下:
$$ g = 357.528^\circ + 0.9856003^\circ n $$
根据需要将L和g多次加或减360°,让数值的范围调整到0°至 360°之间。
最后,太阳的黄经是:
$$ \lambda = L + 1.915^\circ \sin g + 0.020^\circ \sin 2g$$
太阳的黄纬是:
$$ \beta = 0 $$
太阳的黄纬不超过0.00033,
并且从太阳到地球的距离,以天文单位度量是:
$$ R = 1.00014 - 0.01671 \cos g - 0.00014 \cos 2g $$
赤道坐标系统是使用得最广泛的天球坐标系统,他的元素是:
他与地理坐标系统非常相似,因为两者使用相同的基准平面和相同的极点。地球的赤道在天球上的投影就称为天球赤道,相同的,地理极点在天球上的投影就是天极,如图2所示。
在经过一夜或数个夜晚,就能看出来星星在天空中的位置移动了,当然,这并非恒星在天球上的运动,只是地球运动造成的。因为岁差和章动的影响,在相当长的时间间隔下所做的观测,就必须注明所使用的特殊历元,为行星、恒星、星系等等的位置做记录。现在使用的历元是J2000.0分点,稍早期使用的是B1950.0分点。
赤道坐标系统中与纬度相似的值是赤纬(缩写为Dec.),是天体在天球赤道上方或下方的角度。与经度对应的是赤经(缩写为RA),是与春分点的角度距离,不同于经度的是赤经以时、分、秒为单位,而非度、分、秒。
$\lambda$、$\beta$ 和 $R$ 构成太阳在黄道座标完整的位置。通过黄赤交角 $ε$ 的计算可以转换成赤道座标,计算方法如下:
赤经:
$$ \alpha = \arctan(\cos \epsilon \tan \lambda)$$
赤纬:
$$ \delta = \arcsin(\sin \epsilon \sin \lambda)$$
其中,黄赤交角不是固定不变的,它目前的值接近:
$$ \epsilon = 23.439^\circ - 0.0000004^\circ n $$
地平坐标系,又作地平座标系,是天球坐标系统中的一种,以观测者所在地为中心点,所在地的地平线作为基础平面,将天球适当的分成能看见的上半球和看不见(被地球本身遮蔽)的下半球。上半球的顶点(最高点)称为天顶,下半球的顶点(最低点)称为地底。如图3所示。
地平坐标系统是:
因此地平坐标系有时也被称为高度/方位(Alt/Az)坐标系统。
只要知道观测者的地理坐标与时间,就可以将地平坐标转换成赤道坐标,或是反过来将赤道坐标转换成地平坐标。(纬度在北极点是+90°,在赤道是0°,南极点是-90°。)
在数学公式中,以$A$代表方位,$a$代表高度。
以$\delta$ 表示赤纬,$H$ 表示时角。 $φ$ 为观测者所在地的纬度。
赤道坐标转为地平坐标的计算方法如下:
$$\sin a=\sin \phi \cdot \sin \delta +\cos \phi \cdot \cos \delta \cdot \cos H$$
$${\displaystyle \cos A\cdot \cos a=-\cos \phi \cdot \sin \delta +\sin \phi \cdot \cos \delta \cdot \cos H}$$
$${\displaystyle \sin A\cdot \cos a=\cos \delta \cdot \sin H}$$
有些人或许会试图将最后两个公式相除来加以简化,以消除$\cos a$,而只剩下$\tan A$。但是正切函数不能清楚的区别出象限,例如45°和225°是完全不同的方位,分别指向相对的东北方和西南方。
时角(HA)是天文学的名词,一个天体的时角被定义为该天体的赤经与当地的恒星时的差值。 在天文学和天文航海中,时角是在赤道坐标系中用于给出天球上点的方向的坐标之一。 一个点的时角是两个平面之间的角度:一个平面包含地轴和天顶(子午面),另一个平面是穿过该点与极点(地轴)的球面大圆切圆所形成的平面(赤经圈)。如图4所示。
时角由天赤道平面上的橙色箭头指示。 箭头自天球天赤道的子午面至观测目标所在面的球面大圆处结束,该球面大圆也是赤经圈
时角由子午线确定,遵循的规则是在子午线的东边则为负时角,在子午线的西边则为正时角,或者向西为正的360度,时角与经度的换算方法为24h = 360°。
一个天体的时角表示该天体是否通过了当地的子午圈(中天)。其数值则表示了该天体与当地子午圈的角距离,并借用时间的单位,以小时来计量(1HA = 15度)。例如,一个天体的时角是2.5HA,就表示他已经在2.5个小时之前通过当地的子午圈,并且在当地子午圈的西方37.5度的距离上。负数则表示在多少小时之后将通过当地的子午圈。当然,当时角为0时的意思就是这个天体就在当地的子午圈上。
经纬高是地理坐标系的表示方法,北天东则是一种直角坐标系。它们之间通过直角坐标系原点的经纬度联系起来,并可相互转换。下面介绍它们之间的转换方法。
目前常用的坐标系统分成两种:地理坐标系和直角坐标系。下面分别介绍这两种坐标系。
地理坐标系一般是指由经度、纬度和相对高度组成的坐标系,能够标示地球上的任何一个位置。经度和纬度常合称为经纬度,把球面上的经纬度显示在平面地图上需要采用某种地图投影。
地理坐标系的用途很广泛,例如天文学上常用的黄道坐标系、赤道坐标系同样也是一种地理坐标系。
笛卡尔坐标系(英语:Cartesian coordinate system,也称直角坐标系)在数学中是一种正交坐标系,由法国数学家勒内·笛卡尔引入而有此名。
二维的直角坐标系通常由两个互相垂直的坐标轴设定,通常分别称为x-轴和 y-轴;两个坐标轴的相交点,称为原点,通常标记为O,既有“零”的意思,又是英语“Origin”的首字母。每一个轴都指向一个特定的方向。这两个不同线的坐标轴,决定了一个平面,称为xy-平面,又称为笛卡尔平面。通常两个坐标轴只要互相垂直,其指向何方对于分析问题是没有影响的,但习惯性地,x-轴被水平摆放,称为横轴,通常指向右方;y-轴被竖直摆放而称为纵轴,通常指向上方。两个坐标轴这样的位置关系,称为二维的右手坐标系,或右手系。
直角坐标系也可以推广至三维空间与高维空间 (higher dimension)。在原本的二维直角坐标系,再添加一个垂直于x-轴,y-轴的坐标轴,称为z-轴。假若,这三个坐标轴满足右手定则,则可得到三维的直角坐标系。这z-轴与x-轴,y-轴相互正交于原点。在三维空间的任何一点P,可以用直角坐标${\displaystyle (x,\ y,\ z)}$来表达其位置。
直角坐标系的用途非常广泛。例如天文学上常用的赤道直角坐标系、地平坐标系是一种直角坐标系。地心地固坐标系、北天东坐标系、北东地坐标系都是一种直角坐标系。
经纬高与北天东的转换方法,通常通过地心地固坐标系作为中介进行转换。例如,经纬高转北天东,首先将经纬高转地心地固坐标系,再将地心地固坐标系转北天东坐标系。北天东转经纬高亦如此。
地心地固坐标系的示意图如图1所示。
近几年美国对中国的科技封杀十分严重,说不定哪天Windows操作系统就不让我们用了。因此,在构建C/C++项目时应考虑跨平台,哪天不让用Windows了,可以请容易的将项目移植到Linux上。不同系统平台有不同的C/C++编译器,不同编译器有不同的构建规则,针对每个平台的不同编译器编写构建规则十分复杂,幸好有CMake可简化构建规则的编写,实现一次编写,不同平台适用。下面简单介绍CMake的使用。
代码变成可执行文件,叫做编译(compile);先编译这个,还是先编译那个(即编译的安排),叫做构建(build)。
Make是最常用的构建工具,诞生于1977年,主要用于C语言的项目。但是实际上 ,任何只要某个文件有变化,就要重新构建的项目,都可以用Make构建。
Make工具有很多,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。
CMake就是针对上面问题所设计的工具:它首先允许开发者编写一种平台无关的 CMakeList.txt 文件来定制整个编译流程,然后再根据目标用户的平台进一步生成所需的本地化 Makefile 和工程文件,如 Unix 的 Makefile 或 Windows 的 Visual Studio 工程。从而做到“Write once, run everywhere”。显然,CMake 是一个比上述几种 make 更高级的编译配置工具。一些使用 CMake 作为项目架构系统的知名开源项目有 VTK、ITK、KDE、OpenCV、OSG 等。
语法:
1 | project(<PROJECT-NAME> [LANGUAGES] [<language-name>...]) |
该指令定义工程名称。例如:
1 | project(UtilTool) |
语法:
1 | include_directories([AFTER|BEFORE] [SYSTEM] dir1 [dir2 ...]) |
它相当于g++选项中的-I参数的作用,也相当于环境变量中增加路径到CPLUS_INCLUDE_PATH变量的作用。例如:
1 | include_directories(${CMAKE_CURRENT_LIST_DIR}/include) |
当头文件分散在不同层次和深度的目录中时,逐个使用include_directories命令添加包含目录十分麻烦,可使用如下方法递归加载各个目录:
1 | MARO(HEADER_DIRECTORIES return_list) |
语法:
1 | link_directories(directory1 directory2 ...) |
它相当于g++命令的-L选项的作用,也相当于环境变量中增加LD_LIBRARY_PATH的路径的作用。
1 | link_directories(${CMAKE_CURRENT_LIST_DIR}/lib) |
ADD_SUBDIRECTORY用于向当前工程添加存放源文件的子目录,并可以指定中间二进制和目标二进制存放的位置。语法如下:
1 | ADD_SUBDIRECTORY(source_dir [binary_dir] |
上面的例子定义了将 src 子目录加入工程,并指定了编译输出路径为 bin 目录。如果不指定 bin 目录,那么编译的结果都将存放在 build/src 目录。
语法:
1 | target_link_libraries(<target> [item1 [item2 [...]]] |
该指令的作用为将目标文件与库文件进行链接。例如:
1 | TARGET_LINK_LIBRARIES(utiltool-example utiltool) |
语法:
1 | add_executable(<name> [WIN32] [MACOSX_BUNDLE] |
例如:
1 | ADD_EXECUTABLE(utiltool-example examples/ConverterTest.cpp) |
语法:
1 | add_library(<name> [STATIC | SHARED | MODULE] |
该指令的主要作用就是将指定的源文件生成链接文件,然后添加到工程中去。例如:
1 | ADD_LIBRARY(utiltool SHARED ${UTILTOOL_SOURCES}) |
语法:
1 | install(TARGETS targets... [EXPORT <export-name>] |
该命令为一个工程生成安装规则。TARGETS格式的install命令规定了安装工程中的目标(targets)的规则。有5中可以被安装的目标文件:ARCHIVE,LIBRARY,RUNTIME,FRAMEWORK,和BUNDLE。静态链接的库文件总是被当做ARCHIVE目标。模块库总是被当做LIBRARY目标。例如:
1 | install(TARGETS utiltool |
语法:
1 | set(<variable> <value> |
该指令用于给一般变量,缓存变量,环境变量赋值。例如:
1 | # set up versioning. |
语法:
1 | add_definitions(-DFOO -DBAR ...) |
该指令添加编译参数。例如:
1 | # 添加WIN32宏定义 |
语法:
1 | option(<option_variable> "help string describing option" |
该指令提供一个用户可以任选的选项,可在之后由用户通过CMake的GUI或者命令行进行更改。例如:
1 | OPTION(UTILTOOL_EXAMPLES "Build the examples" ON) |
CMAKE_MODULE_PATH是供find_package搜索第三方库用的。cmake的默认Modules目录在安装目录中:cmake-3.11.3-win64-x64\share\cmake-3.11\Modules。
如果要追加Modules目录,有3种方式:
1 | SET(CMAKE_MODULE_PATH "${OpenSceneGraph_SOURCE_DIR}/CMakeModules;${CMAKE_MODULE_PATH}") |
通常情况下,包含第三方库需要写以下内容:
1 | include_directories("${project_root_path}/include/") |
如果引用的很多个第三方库,那么类似上面的内容会写很多,且如果自己的多个项目都引用了某个第三方库,那么我每个项目的CmakeList.txt都得写一遍,重复劳动很多。那么有没办法为每个第三方库只定义一次它的头文件和库文件信息,然后在自己的工程中只指定名称即可?(类似编译Java的Maven仓库)答案是当然可以,find_package帮你解决。
find_package定义在自己工程的CmakeList.txt中:
1 | find_package( XXX CONFIG REQUIRED ) |
然后cmake就会在默认的Modules(即CMAKE_MODULE_PATH指定的目录)目录中搜索这个XXX第三方库。
搜索有两种模式:FindXXX.cmake和XXXConfig.cmake。前者叫做Module模式,后者叫做Config模式。
1 | # CMakeList.txt: UtilTool 的 CMake 项目,在此处包括源代码并定义 |
为熟练使用C++创建项目,应掌握常用的C++库。现总结常用的C++库如下:
它的设计目的是希望建立一套既具像C++ 一样方便,同时又比Fortran速度更快的数值计算环境。通常,用C++所写出的数值程序, 比 Fortran慢20%左右,因此Blitz++正是要改掉这个缺点。方法是利用C++的template 技术,程序执行甚至可以比Fortran更快。
专注于线性代数相关的计算任务,如各种形式矩阵的生成(对角,共轭,稀疏,对称等),相关的计算,变换,以及与一维向量的运算。
一个免费的高性能的C++库,用于处理并行式科学计算。POOMA的面向对象设计方便了快速的程 序开发,对并行机器进行了优化以达到最高的效率,方便在工业和研究环境中使用。
Computational Geometry Algorithms Library的目的是把在计 算几何方面的大部分重要的解决方案和方法以C++库的形式提供给工业和学术界的用户。
是一个大型C + +库的几何数据结构和算法,如Delaunay三角网,网格生成,布尔运算的多边形,以及各种几何处理算法。 CGAL是用来在各个领域:计算机图形学,科学可视化,计算机辅助设计与建模,地理信息系统,分子生物学,医学影像学,机器人学和运动规划,和数值方法。
旨在解决线性和非线性的数值计算问题。也是跨平台的,源码中用了大量m4语言。
线性代数、矩阵、向量操作等运算的C++库。推荐使用。
mygsl是一个基于GSL库的个性化开源数值计算项目.
软件名称 IMSL C Numerical Library(不兼容vc6 编译器)。
分为统计库和数学库两部分。数学库包含应用数学和特殊函数。IMSL 程序库已成为数值分析解决方案的工业标准。 IMSL 程序库提供最完整与最值得信赖的函数库。 IMSL 数值程序库提供目前世界上最广泛被使用的 IMSL 算法,有超过 370 验证过、最正确与 thread-safe 的数学与统计程序。 IMSL FORTRAN 程序库提供新一代以 FORTRAN 90 为程序库基础的程序,能展现出最佳化的演算法能力应用于多处理器与其它高效能运算系统。
庞大、复杂,适合大型项目。开源、免费,不依赖第三方库,支持跨平台。
Asio基于Boost开发的异步IO库,封装了Socket,简化基于socket程序的开发。
开源、免费,支持跨平台。
POCO C++ Libraries 提供一套 C++ 的类库用以开发基于网络的可移植的应用程序,功能涉及线程、线程同步、文件系统访问、流操作、共享库和类加载、套接字以及网络协议包括:HTTP、 FTP、SMTP 等;其本身还包含一个 HTTP 服务器,提供 XML 的解析和 SQL 数据库的访问接口。POCO库的模块化、高效的设计及实现使得POCO特别适合嵌入式开发。在嵌入式开发领域,由于C++既适合底层(设备I/O、中断处理等)和高层面向对象开发,越来越流行。
Libevent是一个轻量级的开源高性能网络库,从它的官网标题:libevent-an event notification library就能知道它的机制是采用事件触发,封装了以下三种事件的响应:IO事件,定时器事件,信号事件。select模型来实现跨平台的操作,Windows环境下支持IOCP。Google的开源WEB浏览器Chromium在Mac和Linux版本中,也使用了Libevent,足见该库的质量。
libev和libevent很像,按照作者的介绍,可以作为libevent的替代者,能够提供更高的性能。
libev是一个高性能事件循环,所实现的功能就是一个强大的reactor。
封装了sockets C API的C++类库。
支持SSL, IPv6, tcp 和 udp sockets, sctp sockets, http协议, 高度可定制的错误处理。
libcurl是免费的轻量级的客户端网络库,支持DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet, TFTP. 支持SSL, HTTP POST, HTTP PUT, FTP上传, HTTP form上传,代理,cookies, 用户名与密码认证。
如果你开发的是客户端,libcurl是一个不错的选择。
clsocket是一组轻量级的类,允许开发人员实现基于IP的网络程序。这个编译简单而且用起来也简单,推荐使用。
Web应用在部署前,最好进行压力测试,以衡量其是否达到设计指标,判断其在何种极限条件下应用功能会失效。下面即介绍软件测试中压力测试,尤其是Web应用压力测试的相关知识。
压力测试(英语:Stress testing)是针对特定系统或是组件,为要确认其稳定性而特意进行的严格测试。会让系统在超过正常使用条件下运作,然后再确认其结果。进行压力测试的原因可能包括:
软件测试中的压力测试是在超过正常运作条件以外的条件下运作系统,以确认健壮性的方式。压力测试对于关键任务软件格外的重要,但可以适用于各种的软件。压力测试一般较强调软件在高负载下的健壮性、可用性及异常处理,以及哪些在一般使用环境下算是正常行为。
例如一个网站设计容量是100个人同时点击,压力测试就要是采用120个同时点击的条件测试。
web应用的性能指标主要有响应时间,吞吐量,并发量,性能计数器。
响应时间指应用执行一个操作需要的时间,即从发出请求到最后收到响应数据所需要的时间。例如:打开一个网站的响应时间、数据库查询一条记录(有索引)的响应时间等等。
实践中通常采用的办法是重复请求,比如一个请求操作重复执行1万次,测试一万次执行的总响应时间之和,然后除以1万,就得到单次请求的响应时间。
吞吐量指单位时间内系统处理的请求数量,体现系统的整体处理能力。对于网站,可用“请求数/秒”、“页面数/秒”或“访问人数/天”、“处理业务数/小时”等来衡量。重要指标有TPS(每秒处理的事物数)、QPS(每秒查询的请求数)、HPS(每秒HTTP请求数)等。
并发量指系统能够同时处理的请求的数目,这个数字反映了系统的负载性能。对于网站而言,并发数指网站用户同时提交请求的用户数目。
性能计数器描述服务器或操作系统性能的一些数据指标。如System Load、对象与线程数、内存使用、CPU使用、磁盘与网络I/O等使用情况。通过对这些指标设置报警阈值,当监控系统发现性能计数器超过阈值时,就向开发人员和运维报警,及时发现异常并处理。
压力测试工具有http_load、apache ab、siege。