C++ 性能剖析 (四):Inheritance 对性能的影响,剖析inheritance_PHP教程
C++ 性能剖析 (四):Inheritance 对性能的影响,剖析inheritance
(这个editor今天有毛病,把我的format全搞乱了,抱歉!)
Inheritance 是OOP 的一个重要特征。虽然业界有许多同行不喜欢inheritance,但是正确地使用inheritance是一个应用层面和架构层面的重要设计决定。 大量使用inheritance,尤其在类似std container 中使用,会对程序性能产生何等影响呢?
从我个人的经验来看,constructor对创建具有深层inheritance链的class,有很大的影响。 如果应用容许,最好使用没有constructor的基类。下面举个例子:
struct __declspec(novtable) ITest1
{ virtual void AddRef() = 0;
virtual void Release() = 0;
virtual void DoIt(int x) = 0; };
class CTest: public ITest1
{
int ref;
public: inline CTest() { ref = 0; }
inline void AddRef() { ++ref; }
inline void Release() {--ref; }
inline void DoIt(int x) {ref *= x; }
inline void AddRef2() { ++ref; }
inline void Release2() {--ref; }
inline void DoIt2(int x) {ref *= x; }
static void TestPerf(int loop); };
这是个dummy程序,然而在COM中确是再常见不过。如果我们要大量创建并使用CTest,有经验的程序员应该看出,ITest1 完全不需要constructor。 根据C++ 说明书,ITest1因为有虚拟函数,属于“非简单构造类”,编译必须产生一个constructor,其唯一的目的是设置ITest1的vtbl (虚拟函数表)。
然而interface的唯一作用是被继承,所以其vtbl一定是被其继承类设置。编译在这种情况下没必要生成constructor。 微软在设计ATL时认识到这一点,推出自己的方案来躲避C++官方SPEC的缺陷:VC++提供了novtable的class modifier,告诉编译:我不需要你的constructor. 然而我在VS 2010中的测试结果却令人失望:
ITest1的constructor 仍然被生成了,只是它没有将vtbl赋值而已,这对增进基类构造的性能实为杯水车薪之举。 下面我们看看这个“毫无用处的constructor”对性能的影响。 我们权且拿出另一个不需要虚拟函数的ITestPOD (POD的意思是“数据而已”)来做比较:
struct ITest1POD
{ inline void AddRef() { }
inline void Release() { }
inline void DoIt(int x) { } };
ITestPOD当然不能完全作interface用(interface必须用虚拟函数),仅仅为了测试。然后,我们设计一个继承类,和上面的CTest功能完全一样:
class CTestPOD: public ITest1POD
{
int ref;
public: inline CTestPOD() { ref = 0; }
inline void AddRef() { ++ref; }
inline void Release() {--ref; }
inline void DoIt(int x) {ref *= x; }
};
我们的目的是用这个CTestPOD来和CTest作一番苹果与苹果的比较:
void CTest::TestPerf(int loop)
{
clock_t begin = clock();
for(int i = 0; i
{
CTestPOD testPOD; // line1
testPOD.AddRef();
testPOD.DoIt(0);
testPOD.Release();
}
clock_t end = clock();
printf("POD time: %f \n",double(end - begin) / CLOCKS_PER_SEC);
begin = clock();
for(int i = 0; i
{
CTest test; // line2
test.AddRef2();
test.DoIt2(0);
test.Release2();
}
end = clock();
printf("Interface time: %f \n",double(end - begin) / CLOCKS_PER_SEC);
}
上面的loop1和loop2的唯一区别在line1和line2,为了避免用虚拟函数,我特意给CTest准备了AddRef2,DoIt2,Release2,三个同样的但却是非虚拟的函数,为的是遵循性能测试的一大原理:compare apple to apple。
我将loop设为10万,测试结果显示,loop2比loop1的速度低了20% 左右。从生成的代码来看,唯一的区别是CTest的constructor调用了编译自动生成的ITest1 的constructor。这个constructor没有任何作用,却白占了许多CPU周期。一个好的编译,应该是可以把这个constructor裁剪掉的,这个靠我们自己去搜索了。
总结
在应用inheritance时,除去基类里无用的constructor,对大量构造的object的性能来说,会有明显的影响。不幸的是,微软的__declspec(novtable) class modifier对解决这个问题没有提供任何帮助。在设计海量存储的object的应用中,我们应该尽量用POD来做其基类,避免上面CTest类那样明显的性能漏洞。
2014-9-3 西雅图
在所有的固体中,原子靠键结合在一起。键使固体具有强度和相应的电学和热学性能。例如,强的键导致高熔点、高弹性模量、较短的原子间距和较低的热膨胀系数。
一、化学键
1. 离子键
离子键是由正负电荷的相互吸引造成的。例如,钠原子的价轨道中有一个电子,它很容易将外层电子释放而成为带正电的离子。同样,氯原子容易接受一个电子进入它们的价轨道直至达到八个电子而成为带负电的离子。既然带负电和带正电的材料之间总存在静电引力,那么在带不同电荷的相邻离子间就形成了键。离子键的特点是与正离子相邻的是负离子,与负离子相邻的是正离子,如NaCl晶体,见图2-1。
2 共价键
共价键是一种强吸引力的结合键。当两个相同原子或性质相近的原子接近时,价电子不会转移,原子间借共用电子对所产生的力而结合,形成共价键。共价键使原子间有很强的吸引力,这一点在金刚石中很明显,金刚石是自然界中最硬的材料,而且它完全是由碳原子组成。每个碳原子有四个价电子,这些价电子与邻近原子共用,形成完全由价电子对结合而成的三维点阵。这些三维点阵使金刚石具有很高的硬度和熔点。
3. 金属键
金属是由金属键结合而成的,它具有同非金属完全不同的特性。金属原子的外层电子少,容易失去。当金属原子相互靠近时,这些外层原子就脱离原子,成为自由电子,为整个金属所共有,自由电子在金属内部运动,形成电子气。这种由自由电子与金属正离子之间的结合方式称为金属键,见图2-2。4. 分子键
分子键又叫范德瓦尔斯键,是最弱的一种结合键。它是靠原子各自内部电子分布不均匀产生较弱的静电引力,称为范德瓦尔斯力,由这种分子力结合起来的键叫做分子键。
5. 氢键
另一种范德瓦尔斯力实际上是极性分子的一种特殊情况。C-H、O-H或N-H键端部暴露的质子是没有电子屏蔽的,所以,这个正电荷可以吸引相邻分子的价电子,于是形成了一种库仑型的键,称为氢键,氢键是所有范德瓦尔斯键中最强的。氢键最典型的例子是水,一个水分子中氢质子吸引相邻分子中氧的孤对电子,氢键使水成为所有低分子量物质中沸点最高的物质。
二、结合键对材料性能的影响
1. 金属材料
金属材料的结合键主要是金属键。由于自由电子的存在,当金属受到外加电场作用时,其内部的自由电子将沿电场方向作定向运动,形成电子流,所以金属具有良好的导电性;金属除依靠正离子的振动传递热能外,自由电子的运动也能传递热能,所以金属的导热性好;随着金属温度的升高,正离子的热振动加剧,使自由电子的定向运动阻力增加,电阻升高,所以金属具有正的电阻温度系数;当金属的两部分发生相对位移时,金属的正离子仍然保持金属键,所以具有良好的变形能力;自由电子可以吸收光的能量,因而金属不透明;而所吸收的能量在电子回复到原来状态时产生辐射,使金属具有光泽。
金属中也有共价键(如灰锡)和离子键(如金属间化合物Mg3Sb2)。
2. 陶瓷材料
简单说来,陶瓷材料是包含金属和非金属元素的化合物,其结合键主要是离子键和共价键,大多数是离子键。离子键赋予陶瓷材料相当高的稳定性,所以陶瓷材料通常具有极高的熔点和硬度,但同时陶瓷材料的脆性也很大。
3. 高分子材料
高分子材料的结合键是共价键、氢键和分子键。其中,组成分子的结合键是共价键和氢键,而分子间的结合键是范德瓦尔斯键。尽管范德瓦尔斯键较弱,但由于高分子材料的分子很大,所以分子间的作用力也相应较大,这使得高分子材料具有很好的力学性能。
三、晶体与非晶体
在研究了结合键后,我们下一步的任务就是从原子或分子的排列方式上考虑材......余下全文>>
玻璃幕墙新规范、工程检验标准的
探讨和介绍
山东省建筑科学研究院(山东省建设机械质量监督检测中心)
李 承 伟
山东省建设机械质量监督检测中心作为我省的专职建筑幕墙检测单位,同时也作为国家工业产品生产许可证指定检测单位,近年来,对我省建筑幕墙工程进行了长期的测试和跟踪调查,初步掌握了我省建筑幕墙工程制造质量和施工水平的第一手资料。对比国内先进企业的技术水平,我省幕墙企业不仅在生产技术水平上存在一定的差距,同时,在对建筑幕墙的技术设计和施工手段上也存在一定的距离,重点反映在对规范的理解和贯彻上存在较大的差距。下面,就针对建筑幕墙的设计、计算及对规范的理解等方面,谈一下我们的看法。
一、《玻璃幕墙工程技术规范》JGJ102-2003修订内容概述
《玻璃幕墙工程技术规范》JGJ102-2003自2004年1月1日起实施,原行业标准《玻璃幕墙工程技术规范》JGJ102-96同时废止。JGJ102-2003修订内容较大,不仅增加了强制性条款、而且还增加了全玻幕墙及点支承幕墙内容、对其他内容也进行了较大的修订。
(一)增加的强制性条款:
1、硅酮结构密封胶在隐框和半隐框玻璃幕墙中使用,其玻璃与铝型材的粘结必须采用中型硅酮结构密封胶。
硅酮结构密封胶使用前,应经国家认可的检测机构进行与其相接触材料的相容性和剥离粘结性试验,并应对邵氏硬度、标准状态下拉伸粘结性能进行复验。检验不合格的产品不得使用。进口硅酮结构密封胶应具有商检报告。硅酮结构密封胶和硅酮建筑密封胶必须在有效期内使用。
硅酮结构密封胶应根据不同的受力情况进行承载力极限状态验算。
除全玻幕墙外,不应在现场打注硅酮结构密封胶。
2、结构件应按规定验算承载力和挠度并达到规范要求。
立柱主要受力部位铝型材截面开口部位的厚度不应小于3.0mm,闭口部位的厚度不应小于2.5mm;型材孔壁与螺钉之间直接采用螺纹受力连接时,其局部厚度尚不应小于螺钉的公称直径;钢型材截面主要受力部位的厚度不应小于3.0mm。
横梁主要受力部位铝合金型材的厚度不应小于2.0mm;当横梁跨度大于1.2 m时,其截面主要受力部位的厚度不应小于2.5mm。型材孔壁与螺钉之间直接采用螺纹受力连接时,其局部截面厚度不应小于螺钉的公称直径。钢型材截面主要受力部位的厚度不应小于2.5mm。
3、人员流动密度大、青少年或幼儿活动的公共场所以及使用中容易受到撞击的部位,其玻璃幕墙应采用安全玻璃;对使用中容易受到撞击的部位,尚应设置明显的警示标志。
(二)全玻幕墙的主要内容:
面板玻璃的厚度不宜小于10mm,当面板玻璃为夹层玻璃时,其单片厚度不应小于8 mm。
玻璃肋的截面厚度不应小于12mm,截面高度不应小于100mm。而且,该条为强制性条款。
在风荷载标准值作用下,玻璃肋的挠度限值宜取其计算跨度的1/200。
采用浮头式连接件的幕墙玻璃厚度不应小于6 mm;采用沉头式连接件的幕墙玻璃厚度不应小于8 mm。玻璃之间的空隙宽度不应小于10 mm,且应采用硅酮建筑密封胶嵌缝。该部分为强制性条款。
点支承玻璃幕墙的支承结构宜单独进行计算。
无论单根型钢或钢管作为支承结构、采用桁架或空腹桁架作为支承结构,在风荷载标准值作用下,其挠度极限宜取其跨度的1/250。
张拉杆索体系应在正反两个方向上形成承受风荷载或地震作用的稳定结构体系,连接件、受压杆或拉杆宜采用不锈钢材料,杆件直径不宜小于10mm,拉索钢绞线直径不宜小于8 mm。拉杆不宜采用焊接,拉索不应采用焊接。在风荷载标准值作用下,其挠度极限宜取其跨度......余下全文>>

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











C에서 숯 유형은 문자열에 사용됩니다. 1. 단일 문자를 저장하십시오. 2. 배열을 사용하여 문자열을 나타내고 널 터미네이터로 끝납니다. 3. 문자열 작동 함수를 통해 작동합니다. 4. 키보드에서 문자열을 읽거나 출력하십시오.

Docker 환경을 사용할 때 Docker 환경에 Extensions를 설치하기 위해 PECL을 사용하여 오류의 원인 및 솔루션. 종종 일부 두통이 발생합니다 ...

C35의 계산은 본질적으로 조합 수학이며, 5 개의 요소 중 3 개 중에서 선택된 조합 수를 나타냅니다. 계산 공식은 C53 = 5입니다! / (3! * 2!)는 효율을 향상시키고 오버플로를 피하기 위해 루프에 의해 직접 계산할 수 있습니다. 또한 확률 통계, 암호화, 알고리즘 설계 등의 필드에서 많은 문제를 해결하는 데 조합의 특성을 이해하고 효율적인 계산 방법을 마스터하는 데 중요합니다.

언어의 멀티 스레딩은 프로그램 효율성을 크게 향상시킬 수 있습니다. C 언어에서 멀티 스레딩을 구현하는 4 가지 주요 방법이 있습니다. 독립 프로세스 생성 : 여러 독립적으로 실행되는 프로세스 생성, 각 프로세스에는 자체 메모리 공간이 있습니다. 의사-다일리트 레딩 : 동일한 메모리 공간을 공유하고 교대로 실행하는 프로세스에서 여러 실행 스트림을 만듭니다. 멀티 스레드 라이브러리 : PTHREADS와 같은 멀티 스레드 라이브러리를 사용하여 스레드를 만들고 관리하여 풍부한 스레드 작동 기능을 제공합니다. COROUTINE : 작업을 작은 하위 작업으로 나누고 차례로 실행하는 가벼운 다중 스레드 구현.

STD :: 고유 한 컨테이너의 인접한 중복 요소를 제거하고 끝으로 이동하여 반복자를 첫 번째 중복 요소로 반환합니다. STD :: 거리는 두 반복자 사이의 거리, 즉 그들이 가리키는 요소의 수를 계산합니다. 이 두 기능은 코드를 최적화하고 효율성을 향상시키는 데 유용하지만 : std :: 고유 한 중복 요소를 다루는 것과 같이주의를 기울여야합니다. 비 랜덤 액세스 반복자를 다룰 때는 STD :: 거리가 덜 효율적입니다. 이러한 기능과 모범 사례를 마스터하면이 두 기능의 힘을 완전히 활용할 수 있습니다.

C 언어에서 뱀 명칭은 코딩 스타일 컨벤션으로 여러 단어를 연결하여 여러 단어를 연결하여 가변 이름 또는 기능 이름을 형성하여 가독성을 향상시킵니다. 편집 및 운영에는 영향을 미치지 않지만 긴 이름 지정, IDE 지원 문제 및 역사적 수하물을 고려해야합니다.

C의 Release_Semaphore 함수는 다른 스레드 또는 프로세스가 공유 리소스에 액세스 할 수 있도록 얻은 수피를 해제하는 데 사용됩니다. 세마포어 수를 1 씩 증가시켜 차단 스레드가 계속 실행 될 수 있습니다.

Binance는 OPBNB : BINANCE가 최근 BNB Smart Chain (BSC) - OPBNB 테스트 네트워크를위한 새로운 확장 솔루션 출시를 발표했다고 발표했습니다. 이 기사는 OPBNB의 특성과 사용자에게 잠재적 영향을 설명합니다. OPBNB 세부 설명 OPBNB는 EVM (Ethereum Virtual Machine)과 호환되는 OpmentismoPStack을 구축 한 Layer2 확장 솔루션입니다. BSC의 확장 성을 향상시키고 네트워크 혼잡을 완화하며 거래 비용을 줄이는 것을 목표로합니다. OPBNB를 더 잘 이해하려면 다음의 주요 개념을 이해해야합니다. Layer2 (블록 체인 레이어 2) : 일부 기본 체인 기능을 두 번째 레이어로 전송하여 주를 개선합니다.
