性能

《Linux性能优化》总结:cpu性能、内存性能、文件系统性能、网络性能 来源极客时间 总览 uptime可查看系统平均负载:平均活跃进程数(可运行、不可中断) cpu个数:grep ‘model_name’ /proc/cpuinfo | wc -l mpstat:实时查看cpu性能指标(整体) pidstat:实时查看进程的cpu、内存、io、上下文切换等性能指标 stress:压测 iostat:io状态 超过百分之70的使用率就该警醒 cpu cpu上下文切换:进程/线程/中断上下文切换 vmstat:查看系统上下文切换情况、系统内存使用情况 pidstat -w 阅读详情

做人不要斤斤计较,但写代码一定要斤斤计较!
来看一个Linux-2.4内核中的例子,学习世界顶尖高手的做法。内核中经常要访问进程控制块(PCB),其在内核中定义为task_struct结构。为此在include\asm-i386\current.h中定义了一个宏current,提供指向当前进程的task_strcut结构的指针。

static inline struct task_struct * get_current(void)
{
	struct task_struct *current;
	__asm__("andl %%esp,%0; ":"=r" (current) : "0" (~8191UL));
	return current;
}
#define current get_current()

在内联函数get_current中,首先将esp堆栈指针和~8191UL做“与”操作,就算出了task_struct的地址,然后MOV到current中,再将其返回。注意,这里只涉及到两条指令且都是针对寄存器的操作,一条AND指令,一条MOV指令。而一条AND指令只需要4个CPU时钟周期,一条从寄存器到寄存器MOV指令只需要2个CPU时钟周期,总共只需要6个CPU时钟周期。
而如果采用另外一种方式:定义一个全局变量,在每次调度新进程运行时将该进程的task_struct指针写入这个全局变量,之后使用时再直接访问这个全局变量。实际上每次访问全局变量的话,会涉及到内存的操作,其执行将超过6个CPU时钟周期。因此用内核中的办法每次使用task_struct时把它的地址计算出来反而效率更高 [毛德操、胡希明]。

优化性能热点

记住80-20规则:20%的代码占用了80%的时间。程序的大部分性能消耗都是集中在小部分代码上,这小部分代码就是性能热点。
当然首先你得找到这些热点所在,除了使用一些性能分析工具外(比如Profiler),最简单有效的方法就是在程序块中增加日志。首选对整个程序的运行流程进行划分,将其分成各个粒度更小的子流程,然后在这些子流程的首尾增加代码,在开始的地方获取系统当前的tick,在结束的地方再获取一次当前tick,然后两者相减,并把结果记录到日志中。当然记录日志的前提是日志本身的I/O对程序运行时间的影响可以忽略。如果I/O对程序影响较大时,可以考虑先把相关的时间信息记录到一个内存块中,待程序流程执行结束后再将内存块中的时间信息输出。
找到耗时较长的子流程后,需对其代码进行分析,查看是否有比较耗时的操作,再有针对性的进行优化。通常的优化方法包括以下这些。

  • 避免顺序查找

顺序查找应该是最简单直接的编程方法之一。在数据建模时使用数组,然后查找时用一个for循环。但是当该数组中的数据量巨大时,问题就来了,大的循环会消耗很多性能,形成性能热点。
实际上在我负责的公司招聘中一直使用着一个“潜规则”,如果应聘者在解题时使用了顺序查找,那我会慎重考虑,他被录用的可能性极小。这不光是在考察算法,而且还体现出一个软件设计师在开发时的性能意识。如果他把这种不好的开发习惯带到项目中,那后期还要投入更多的人力和时间去补救。
要避免顺序查找,首先在数据结构设计阶段就需要花些心思。针对所要管理的数据集合,寻找它们的特点。通常集合中的各个元素都会有一个唯一标识的ID,该ID可能是一维的,也可能是多维的。把这个ID做为索引,构建相应的hash数据结构,而不是简单的使用数据。C++和JAVA都提供了很多容器(比如hash,map等),可以直接使用。如果是C语言,则需要自己封装一套hash算法。你也可以下载示例(url)HashSample做为参考。
另外,如果这些ID是有序的(比如是int类型),你也可以将管理集合构造为一个有序的数组,在查找时使用二分法。

  • 减少大块内存赋值

在大型系统中的多个模块间传递数据是不可避免的,这些数据包括参数和返回的结果。如果每个模块都定义了一套自己的数据类型,那么在传递时就需要对数据进行赋值转换。
假设有3个模块(类)A、B、C都提供了一个公有函数do_some_thing,都定义了各自的数据类型作为入参。

class A
{
public:
	struct PA{
		int a;
		int b;
		int c;
	};
	void do_some_thing(struct PA* p);

private:
	B *m_b;
};

class B
{
public:
	struct PB{
		int b;
		int c;
		int a;
	};
	void do_some_thing(struct PB* p);

private:
	C *m_c;
};

class C
{
public:
	struct PC{
		int c;
		int a;
		int b;
	};
	void do_some_thing(struct PC* p);
};

如果它们之间存在如下调用关系:A->B->C。那么在每次调用前就需要对参数进行转换。

void A::do_some_thing(struct PA* p)
{
	struct B::PB pb;
	pb.b = p->b;
	pb.c = p->c;
	pb.a = p->a;
	m_b->do_some_thing(&pb);
}

void B::do_some_thing(struct PB* p)
{
	struct C::PC pc;
	pc.c = p->c;
	pc.a = p->a;
	pc.b = p->b;
	m_c->do_some_thing(&pc);	
}

这样的转换繁琐且耗时。通常如果这些模块都是出自同一个开发人员,一般不会出现这样的问题。往往一个大型系统中不同的模块都有不同的人员来维护,由于开发人员的“自负”和交流不畅,往往容易出现类似的问题。出现这种情况时需要架构师介入加以协调,针对各个软件层次对参数的需求加以分析,提炼出一个独立且不依赖于任何其它模块的公共参数模块,来统一各模块间的接口。使得参数能在一个业务流程的各层代码之间直接传递。改进的代码如下:

struct P{
	int c;
	int a;
	int b;
};

class A
{
	void do_some_thing(struct P* p);
};

class B
{
	void do_some_thing(struct P* p);
};

class C
{
	void do_some_thing(struct P* p);
};

另外还有一种大块内存赋值的情况比较隐蔽,容易被人忽视。下面C++例子中的函数参数类型为vector:

void do_some_thing(std::vector<struct P> vp)

C++的参数传递都有一次拷贝赋值,如果数组中的元素数量巨大时,这个拷贝过程会非常耗时,同时也伴随着大量内存消耗。之前在我们的项目中出现过类似的问题,数组中元素个数达到10万的量级,程序运行时直接就“卡死”了!
改进的办法也很简单,将这类参数改为引用(用&修饰)就可避免拷贝赋值。此外,还需要增加数据安全性考虑,因此再加一个const修饰就可以避免函数内部误修改导致数据出错:

void do_some_thing(const std::vector<struct P>& vp)

当然这类问题在JAVA中不会出现,因为JAVA的对象参数传递默认都是传引用的方式。

  • 提炼循环中的公共操作

有时候循环不可避免,比如确实需要针对数据集合中的每个元素进行某项操作时。此时需要分析循环中的每一项操作,是不是有可以提炼的公共部分,类似下面的代码:

	for(int i = 0; i < size; i++)
	{
		v[i]._a = get_some_thing();
		v[i]._b = calc(i);
	}

如果get_some_thing每次返回的值都相同,那么可以把它提到循环外面,只执行一次。下面的优化将该值保存在someV中,以后每次直接赋值。

int someV= get_some_thing();
for(int i = 0; i < size; i++)
{
	v[i]._a = someV;
	v[i]._b = calc(i);
}

还有一种复杂情况,你可能在之前已经对代码进行了封装:

void treat_v(struct V &v, int i)
{
	v._a = get_some_thing();
	v._b = calc(i);
}
for(int i = 0; i < size; i++)
{
	treat_v(v[i], i);
}

这种情况下你需要对代码进行重构,将公共部分和个性部分拆分开来,再重新组织。

  • 避免使用耗时的API

如果你的系统工作在应用层,那难免要和操作系统的api打交道。但是有些api在调用时会非常耗时,例如我曾参与过的一个Windows应用系统开发,其中使用了一些OLE接口,函数的运行时间就非常长。
如果刚好在某些关键流程中使用了这类api,那就得对技术方案进行重新评估。因为我们无法修改其内部代码,只能想办法怎么绕开它。首先可以考虑有没有替代的方案,比如通过其它方法也能达到目的并且性能很好,或者找找有没有某些第三方的程序库也支持该功能,或者自己实现一个性能更好的算法。其次需要分析是否可以降低对它的调用频率,比如只调用一次然后把它的结果缓存起来,以后需要的时候直接查表,而不是每次需要时都调用。
总之如果碰到这类问题很不幸也很无奈。要么绕开它,要么默默忍受

  • 合并数据库语句

我们的系统中有一个流程是把一个报告表的数据插入到数据库的一个特定表中。测试中发现,当有上10万条记录需要入库时,整个流程执行非常缓慢。
因为每一条SQL语句在执行时都会有一次和数据库的交互,底层会进行socket通信:发送SQL指令,数据库接收后进行处理,再将执行结果返回应用程序。因为涉及到网络的通信和调度,这样的交互本身是有一定耗时的。少量的语句执行还感觉不出,但如果是10万次这样的交互,那时间就大大延长了,到了无法接受的程度。
解决办法是将多条记录拼装成一条SQL的INSERT语句,然后再执行。需要注意每个数据库都对SQL语句有长度限制,在拼装时需要保证语句长度不要超过它。这样就大大减少了底层socket通信的次数,整体性能大幅提升,可以满足要求。
这个问题实际上属于上面描述的“提炼循环中的公共操作”中的一种场景,其比较典型,因此单独进行说明。

非热点代码也有优化空间

大部分应用程序在经过上述的方法优化后基本都能达到性能要求。然而如果你的程序是工作在系统底层且对性能要求极高,很可能在实施了上述优化后仍无法满足性能需求。那么是否就黔驴技穷了呢?当然不是。此时我们不得不把目光转向代码的另外80%,从这里面“抠”性能。本节开始处列举的Linux内核中对进程控制块的访问方法就是一个例子。此外还有一些方法可以尝试。

  • 执行概率高的分支提前

下面的伪代码中,if…else…语句中有两部分代码,“代码片段A”和“代码片段B”:

if ( 条件A ) {
	代码片段A
}
else {
	代码片段B
}

如果在实际应用场景中 “条件A”为“假”的概率更高,即程序更多的情况下会走入else分支执行“代码片段B”,那么你需要将这个if…else…语句的逻辑调整如下:

if ( ! 条件A ) {
	代码片段B
}
else {
	代码片段A
}

在if语句的判断中将“条件A”取“否”,并将两个代码片段对调位置。这样的调整并不会影响代码的逻辑,但执行速度能有所提高。这是因为在程序顺序执行的过程中,“代码片段B”的代码段更容易载入CPU的高速缓存(cache),从而获得更高的效率。

  • 使用查表法

假设下面的switch…case语句,其根据不同的命令码来调用相应的函数:

switch(cmdCode){
case 0:
	do_some_thing_0();
	break;
case 1:
	do_some_thing_1();
	break;
//注意这里没有 case 2
case 3:
	do_some_thing_3();
	break;
……此处省略其它case
case 10:
	do_some_thing_10();
	break;
default:
	do_error();
	break;
}

switch…case在编译后是以二分法来查找相应的分支入口,算法已经很快了。但是当分支过多时,仍然需要消耗一定的时间。针对这种情况可以构造一个函数入口表,通过查表法进行处理:

    typedef void (*fpFunc)();
    
    	

    const int maxCmd = 10;
	static fpFunc funMap[maxCmd] = {
		do_some_thing_0,
		do_some_thing_1,
		NULL,
		do_some_thing_3,
		……此处省略其它赋值
		do_some_thing_10,
	};

	if(cmdCode >= 0 && cmdCode <= maxCmd && funMap[cmdCode] != NULL){
		(*funMap[cmdCode])();
	}
	else{
		do_error();
	}

通过构造了一个funMap,直接根据cmdCode找到相应的函数,算法的时间复杂度从O(log2n)降为O(1)。运用这个方法有几点需要注意:

1.所构造的表很可能是个稀疏矩阵,因为并非所有的值都有case,需要将相应的项初始化为NULL。上面的例子中就没有case 2分支。
2.cmdCode的取值范围有可能很大,需要评估内存的开销是否能接受。
3.cmdCode的取值并非从0开始,必要时可以进行一定的转换。比如减去某个固定值以使其从0开始。
4.要求所有case的处理函数接口都相同,在该例中都为void (*fp)()。如果存在函数接口不同的情况,则需要先进行统一。

使用这种方法存在一定的限制条件,因此在修改时需要进行充分的评估。但是这种利用空间换时间的做法提供了一种很有效的性能优化思路。

  • 使用内联函数

函数调用时需要将参数压栈,执行函数跳转指令,存在一定的开销。在绝大部分场景这样的开销是可以忽略的,代码重构的方法指导我们尽量封装小函数以增加代码的内聚性和可维护性。
但是当确实有性能需求而又没有其它更好的优化手段时,就只有在这些小地方动心思了。C++语言提供了内联机制,可以通过inline将函数定义为内联的,这样在编译时函数代码会在每一处调用的地方被展开,实际上也就没有了调用函数的开销。
除了inline还有一种方法我非常不情愿使用,但有的时候又不得不用它。我在H公司曾经参与过的一个项目是基于C语言的VxWorks嵌入式开发。遗憾的是编译器不支持inline。当时项目组在做性能优化时采用了替代方案:把小函数改成宏,用宏来代替内联。但这个方法会带来其它麻烦,比如不利于调试、代码难以维护。写代码很多时候会面临这种两难的选择,当性能和可读性发生冲突时,如果不得不提高性能以满足产品需求,那还是只能选择前者。至于可读性,只能通过加强注释说明来进行补充。

  • 减少乘除法的使用

我曾经写过一个消息处理函数,在模块接收到消息时会在入口处记录一条日志:

void MsgTreat(int msg)
{
	logstr("receive msg:%d\n", msg);
……
}

测试时发现该模块接收的消息非常多而且很频繁,日志文件很快会被写满。于是我采取了一个折中的方法,每1000条消息才记录一次日志,日志只是进行一个统计参考:

void MsgTreat(int msg)
{
msgCnt++;
	if( (msgCnt % 1000) == 1){
		logstr("receive msg:%d, msgCnt=%d\n", msg, msgCnt);
	}
	……
}

这样一来就引入了一个除法操作。除法指令本身性能开销较大,而且这个函数调用频繁,会对性能造成一定影响。因此我又换了一种方法,把“%1000”改成“&0x3ff”:

void MsgTreat(int msg)
{
	msgCnt++;
	if( (msgCnt & 0x3ff) == 1){
		logstr("receive msg:%d, msgCnt=%d\n", msg, msgCnt);
	}
	……
}

新的方法相当于除以1024取余,即每收到1024个消息记录一次日志。既然只是想做个统计,那么每1000条消息记录一次和每1024条消息记录一次其实差别不大,关键是避免了除法运算。
此外在能够将乘除法转换成位移运算的时候,则尽量使用位移运算。比如将一个整数左移1位,相当于乘以2;右移1位相当于除以2。如果你的运算中乘数或除数刚好是2的n次幂,则可以直接使用这种方法。
如果乘数或除数不是2的n次幂,也有变通的方法,比如(n15)可以写成(n<<3 – n),相当于(n16-n)。当然如果程序不涉及到大量的数学运算,一般不会用到这种方法。

  • 选择合适的日志接口

我在Z公司曾参与过一个接入网产品项目,在进行压力测试时呼叫指标始终达不到要求。当时的要求是1万次呼叫最多只允许有4次失败。项目组进行了一个月多的攻关后依然一筹莫展。后来一个同事突发奇想在系统底层把日志关闭(在日志函数入口直接retuen),结果呼叫测试顺利达标!
该问题究其原因主要有两点。首先,当时我们缺乏一个良好的日志框架。我们是用printf进行日志输出,该函数虽然没有文件I/O,但是有两个较耗时的操作,一是对格式化字符串进行处理,因为调用printf一般都要输入若干个参数,需要将参数转化为字符串。二是将字符串内容打印到串口上,有一次串口I/O。
其次,整个项目对日志的记录没有有效的规划管理。所有开发人员为了便于问题定位,都进行了较多的日志记录。这样导致整个呼叫流程中日志量非常巨大。
在电信系统中,对呼叫的接续时延有严格的要求,一旦某个流程超时就会导致呼叫失败。由于上述原因,在呼叫时大量日志的涌入,导致呼叫流程的程序执行耗时变长,最终导致失败。
我们最终的解决方案也非常简单粗暴:在默认情况下把日志关闭,只有在需要定位问题时再临时把日志打开。
当然更好的方法是采用一种改良的日志方案。因为格式化字符串需要性能开销,文件I/O也有开销,所以新的方案需要避免这两种操作。在“日志”一节中介绍的日志框架中还提供了一个日志接口log,其支持3个参数:

log(int logId, int p1, int p2);

第1个参数是日志ID,你可以定义一种ID的编号规则,保证在你的整个工程中一个ID只被一个地方使用。因为这个日志接口没有使用代码所在的文件名和行号,所以在分析日志时只能通过该ID来查找对应的代码。如果同一个ID在多个地方被使用,则无法通过该ID唯一确定是哪一处代码输出的日志。第2、3个参数为日志需要记录的信息。调用该函数时仅将这3个参数记录到一个内存块中后函数即返回,执行速度很快。在日志框架有另外一个线程会周期的把这个内存块中的信息写入日志文件。
这个方法的缺点是使用起来有一些局限性,但优点是性能较好。因此建议仅在对性能要求极高的代码中使用该方法,其它场景还是使用logstr、logmem等方法。

51雾化器实现 1. 雾化器简介 雾化器是将试液雾化的一种器械。雾化器是原子化系统的重要部件,其性能对测定的精密度和化学干扰等产生显著影响。因此要求雾化器喷雾稳定、雾滴细小、均匀和雾化效率高。雾化器的类型有超声雾化器,空气压缩式雾化器,网式雾化器。超声雾化器因其价格合适,适合家用,被广泛应用于加湿器,香薰机等各种小家电,也在医疗领域有很多的应用。家用雾化器的主要器件是一枚雾化片。 家用雾化器分为两种不同类别雾化片,实孔雾化片和微孔雾化片,这两种的喷雾方法和工作原理是有所不同的。不同的雾化片需要特定的频率才能工作。 实孔雾 阅读详情

相关推荐

FDTD Script命令学习-farfield3d/farfieldux/farfielduy

介绍了farfield3d/farfieldux/farfielduy命令功能,及不同应用语法和参数介绍,以及对官网示例进行介绍。

jxxl_1314的博客 3097

赋值一次到底消耗多少性能?

看到一个开发模型:spring.net + NHibernate + .net mvc + extjs分开很多层有ModelDALBLLDTOControllerWebSO其中Model,DTO,SO是实体类来的,为了满足不同的需求而定。 要传输一个页面,要经过三次赋值才能达到目的,所以我写下以下代码: class Program

lijt1987的专栏 1225

用于多种无人机协作的群体智能算法:综合综述

随着无人机技术的快速高水平发展,将多架无人机作为自主控制的编队应用于复杂情况是一个新兴领域的代表之一。在实现自主控制的挑战中,碰撞避免、任务分配、路径规划和编队重构是关键功能。本文对各种经典的无人机群智能算法进行了系统的总结和分析。

erjia_的博客 1万+

C语言中判断int,long型等变量是否赋值的方法

博主这段时间在写一些C程序的代码,由于以前对C不是了解很多,故遇到很多瓶颈,当然,其中也有很多有趣的方法可以利用以解决这些难题,下面这个问题就是博主遇到的一个麻烦。 声明了 int ,long 型等局部变量,在利用一些方法给这些变量赋值之后,想判断这些变量是不是真的被赋初值了,怎么办?当然,如果你不赋值给局部变量,这样会导致整个程序的崩溃,因为,它的内容被系统指向了垃圾内存。下面我们看一段代码:#

张勤一 5166

unity中基于NGUI实现一张图片上在某个地方挖个洞

按照策划的要求,引导时只有被引导的图片是高亮的,其余地方都是黑色半透明,如下图所示: 对应的实现shader如下: Shader "Unlit/TutorialBg" { Properties { _MainTex ("Base (RGB), Alpha (A)", 2D) = "black" {} _ClipRange0 ("Clip Vector

手机游戏开发 3698

从智能家居到智慧城市:AI Agent Harness Engineering 作为统一控制中枢

我们可以把每个独立的智能系统看作一根带有独立功能的电线:智能家居Agent是负责家庭设备控制的电线,社区Agent是负责社区管理的电线,城市交通Agent是负责交通调度的电线,而AHE就是把这些分散的电线整合起来的「智能线束」:它不仅负责把不同接口、不同协议、不同层级的Agent连接起来,还提供统一的编排、调度、协同、观测能力,实现全局效用最大化的智能决策。

AI Agent Harness Engineering 202

如何做性能测试

性能优化的常见概念 吞吐量(TPS, QPS):简单来说就是每秒钟完成的事务数或者查询数。通常吞吐量大表明系统单位时间能处理的请求数越多,所以通常希望TPS越高越好 响应时间:即从请求发出去到收到系统返回的时间。响应时间一般不取平均值,而是要去掉不稳定的值之后再取均值,比如常用的90%响应时间,指的就是去掉了10%不稳定的响应时间之后,剩下90%的稳定的响应时间的均值。从聚类的观点看,其实就是...

笨狐狸 3万+

推荐系统(1):推荐系统评测

对于可以离线优化的指标,我个人的看法是应该在给定覆盖率、多样性、新颖性等限制条件下,尽量优化预测准确度。用一个数学公式表达,离线实验的优化目标是:最大化预测准确度使得 覆盖率 > A多样性 > B新颖性 > C其中,A、B、C的取值应该视不同的应用而定。

数据不会骗人 2527

性能优化——性能分析

从公众号转载,关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、性能分析简介 在完成性能测试之后,需要输出一份性能测试报告,分析系统性能测试的情况。其中测试结果需要包含测试接口的平均、最大和最小吞吐量,响应时间,服务器的 CPU、内存、I/O、网络 IO 使用率,JVM 的 GC 频率等。 通过观察这些调优标准,可以发现性能瓶颈,我们再通过自下而上的方式分析查找

qq_39403646的博客 2674

高通Camx功能feature分析之二:remosaic流程

本文介绍了Remosaic技术及其在图像处理中的应用。Remosaic是将4cell1像素排布还原为普通Bayer结构的过程,分为硬件和软件两种实现方式。文章详细解析了Remosaic流程,包括配流情况、Feature选择、初始化过程,以及触发拍照的完整流程。重点分析了从普通预览切换到全尺寸拍照的关键步骤:激活全尺寸RDI会话、生成请求、等待就绪、唤醒离线线程和重启预览。通过代码层面的分析,揭示了Remosaic技术如何实现高分辨率图像还原,同时说明了该过程中可能出现的预览定屏现象及其原因。

1879

Temporal Noise Reduction(TNR)时序去噪技术解析:原理、平台实践与工程调优路径

随着高画质夜景拍照和高清视频拍摄需求的持续增长,图像传感器在低照度环境下输出信号的噪声问题日益突出。相比空间域降噪(SNR),时序去噪(Temporal Noise Reduction, TNR)利用帧间信息进行融合处理,具备更高的信噪比提升效率及更强的边缘保护能力,已成为移动影像ISP链路中的核心环节。本文系统剖析TNR的算法原理、平台实现机制与工程调试路径,并基于实际开发案例分析其在不同场景下的效果差异及调优方法,为工程师提供从理论到实操的完整路径参考。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 3199

lo性能回归:防止性能退化的方法

在Go语言生态系统中,samber/lo库作为Lodash风格的泛型工具库,为开发者提供了丰富的切片、映射、字符串和函数操作工具。然而,随着代码库的不断演进和功能扩展,性能回归(Performance Regression)成为必须严肃对待的问题。本文将深入探讨lo库的性能测试体系,并提供一套完整的性能回归防护方案。 ## ???? 性能回归的潜在风险 性能回归往往在无声无息中发生,常见的诱因包括...

gitblog_00246的博客 1015

在 SAP 中启用应收/应付“代扣税(Withholding Tax)”功能,本质上是激活并配置“扩展代扣税(Extended Withholding Tax)”模型

摘要:SAP中启用应收/应付代扣税功能需完成3个层级12个核心步骤:1)全局激活公司代码代扣税功能;2)配置代扣税规则、税率和科目,包括定义税种类型、代码、总账科目等;3)在供应商/客户主数据中关联代扣税设置。完成后系统可在发票或付款环节自动计算并过账代扣税,支持多税种并行计算和税率年度调整,最终生成税务报表。常见问题排查需检查公司代码激活状态和主数据配置。(149字)

金牌架构师 831

性能测试之性能优化篇

目录为什么进行性能测试性能测试的目的服务性能优化的思考衡量系统性能常用的指标系统性能计数器性能测试分类如何合理的规划我们的架构性能最后拿数据说话性能优化原则性能优化的方法性能优化的分层思想,所有的优化都会对系统性能产生影响软件性能优化的三板斧,这些虽然很有用,但不能太依赖 为什么进行性能测试 系统上线必会经历测试阶段,功能测试我们可以按照产品的设计原型去执行一条条测试用例来覆盖产品功能点。但是在功能测试之外,如果一个用户接口层服务,我们还需要知道服务的性能指标以了解并评估这个服务在实际的生产环境中可以应对多

weiyi_world的博客 2411

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

系统性能优化、性能指标、性能测试

指的是服务器或者操作系统性能的一些指标数据,包括系统负载System Load、对象和线程数、内存使用、CPU使用、磁盘和网络I/O使用等指标,这些指标是系统监控的重要参数,反映系统负载和处理能力的一些关键指标,通常这些指标和性能是强相关的,这些指标很高,成为瓶颈,通常也预示着性能可能会出现问题。通常,线上系统的负载压力是不稳定的,有时候,为了更好地模拟线上访问压力,稳定性测试的并发访问压力也可以不断调整压测线程数,在不稳定的并发压力下,测试系统的稳定性。吞吐量、响应时间和并发数三者之间是有关联性的。

hlsxjh的博客 1138

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

系统性能设计

zhiding性能设计是系统设计过程的一个必备环节,在进行系统架构设计时,性能设计也非常重要。架构设计实际上是一种平衡设计,需要设计师在各种功能性需求和非功能性需求(性能需求)上做妥协选择。 xit 系统调整 为了优化系统的性能,有事需要对系统进行调整,这种调整也称为性能调整,他是与性能关系相关的主要活动。当系统性能降到最基本的水平时,性能调整由查找和消除瓶颈组成,所谓平静是指系统中的某个硬件...

xLplus的博客 9805

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

性能测试-函数性能分析篇

http://blog.youkuaiyun.com/cwj007/article/details/17329 性能测试-函数性能分析篇 -Quantify        在利用ACT(Application Center Test)进行压力测试后,如何对发现性能问题的模块进行定位,发现性能瓶颈所在,这就需要大家了解一个性能分析工具,Rational Test Suite中的Quantify。Qua

骑驴看唱本 1167

从性能测试员到性能工程师

摘要 许多性能测试人员认为,经过几年的经验,他们会自动成为性能工程师。 但是,这并不是那么简单。 成为性能工程师的道路是漫长而持续的旅程。 本文详细介绍了性能工程师在性能测试之外还需要做的许多事情,并概述了提高职业生涯所需采取的步骤。 内容 自2006年以来,我一直担任性能测试员,并且像许多性能测试员一样,我曾经认为经过几年的经验,我会成为一名性能工程师。 但是,我认为我们需要了解这并不是那...

我的E家 1335

【性能测试】性能测试工具选择

本篇文章主要简单总结下性能测试工具的原理以及如何选型。性能测试和功能测试不同,性能测试的执行是基本功能的重复和并发,需要模拟多用户,在性能测试执行时需要监控指标参数,同时性能测试的结果不是那么显而易见,需要对数据进行分析。这些特点决定了性能测试更适合通过工具来完成。

sinat_37967865的博客 2358

常用性能工具与性能分析

iperf3是一个用于测量网络带宽和性能的强大工具,通过在服务器和客户端之间进行数据传输,可以评估网络的吞吐量、延迟和丢包率等指标。通过定制测试参数和选项,你可以根据需要进行各种类型的网络测试。对于网络性能评估和故障排除,iperf3是一个非常有用的工具。fio是一个功能强大的存储系统性能测试工具,通过编写配置文件并运行fio命令,你可以模拟不同类型的I/O负载,并获取详细的性能指标和统计信息。通过调优参数和选项,你可以进一步定制测试场景,以满足不同的测试需求。

m0_68678128的博客 1259

成为高级性能测试:发现性能瓶颈&掌握性能调优

作为一名测试工作者,对于性能测试的问题肯定不会陌生,但是测试不仅仅是执行和收集数据,更多的应该是分析问题、找到性能瓶颈以及一些优化工作。

伤心的辣条 703

【性能学习】性能测试基础

性能测试(专题一)性能测试基础

Joe Throne 1689

Elasticsearch性能调优之搜索性能优化

magic,如果真的要优化搜索性能的话,就是以下几种办法 1/5,配合起来,就是搜索性能优化的杀手锏 3/4,配合起来,解决各种复杂的搜索需求的性能 1、给filesysgtem cache更多的内存 es的搜索引擎严重依赖于底层的filesystem cache,你如果给filesystem cache更多的内存,尽量让内存可以容纳所有的indx segment file索引数据文件,那么...

lm324114的专栏 968

性能测试之性能调优

性能测试是通过模拟实际使用场景,对系统进行压力测试和负载测试,以评估系统的性能指标,如响应时间、吞吐量和并发能力等。同时,需要注意性能调优是一个持续的过程,随着系统的发展和用户需求的变化,需要不断地进行性能优化和调整。通过监控工具可以及时发现系统的性能问题,并进行调优。3、缓存优化:使用缓存技术,如Redis或Memcached,将频繁访问的数据缓存在内存中,避免频繁的数据库或网络操作,提升系统性能。6、硬件优化:针对特定的硬件平台,对硬件参数进行调整和优化,如CPU频率、内存大小,磁盘是否高效读取等。

HUACE4600的博客 935

性能监视和优化

项目十四性能监视和优化 项目学习目标 1.了解系统性能相关概念; 2.掌握任务管理器的使用; 3.掌握性能监视器的使用。 学习难点 1.任务管理器的使用; 2.性能监視器的使用。 项目任务描述 管理员小李周一早晨刚到办公室就遇到一位心急如焚的用户抱怨自己的文件服务器运行速度太慢,但其他正常,针对这个问题,小李分析可能是由以下几个原因造成的: ①病毒查杀软件的定时查杀时间定在上班时间; ②系统内部感...

weixin_44799437的博客 616
上一篇: 用表驱动消除冗余代码
下一篇: 可读性
林 文
博客等级 码龄18年 14粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值