Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >什么是微观基准?

什么是微观基准?
EN

Stack Overflow用户
提问于 2010-05-15 21:41:19
回答 5查看 24.7K关注 0票数 84

我听说过这个词,但我不太清楚它是什么意思,所以:

  • 这意味着什么而不是什么意思?
  • 有哪些例子说明了什么是微观基准,哪些不是?
  • 微基准测试的危险是什么?如何避免?
    • (或者说这是件好事?)

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-05-15 21:47:15

它的意思就像它在罐头上说的那样--它衡量的是一些“小”的东西的性能,比如对操作系统内核的系统调用。

危险在于,人们可能会利用从微观基准中获得的任何结果来决定优化。我们都知道:

我们应该忘记小效率,大约97%的时间说:过早的优化是万恶之源“--坎特

可能有许多因素扭曲了微基准的结果。编译器优化就是其中之一。如果被测量的操作所花费的时间如此之短,以至于您所使用的测量所用的时间比实际操作本身花费的时间更长,那么您的微基准也将被扭曲。

例如,有人可能会接受for循环开销的微基准:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void TestForLoop()
{
    time start = GetTime();

    for(int i = 0; i < 1000000000; ++i)
    {
    }

    time elapsed = GetTime() - start;
    time elapsedPerIteration = elapsed / 1000000000;
    printf("Time elapsed for each iteration: %d\n", elapsedPerIteration);
}

显然,编译器可以看到,循环完全不做任何事情,并且根本不为循环生成任何代码。因此,elapsedelapsedPerIteration的值几乎是无用的。

即使循环做了一些事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void TestForLoop()
{
    int sum = 0;
    time start = GetTime();

    for(int i = 0; i < 1000000000; ++i)
    {
        ++sum;
    }

    time elapsed = GetTime() - start;
    time elapsedPerIteration = elapsed / 1000000000;
    printf("Time elapsed for each iteration: %d\n", elapsedPerIteration);
}

编译器可能会看到变量sum不会被用于任何东西,并且会对它进行优化,并且也会对for循环进行优化。但是等等!如果我们这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void TestForLoop()
{
    int sum = 0;
    time start = GetTime();

    for(int i = 0; i < 1000000000; ++i)
    {
        ++sum;
    }

    time elapsed = GetTime() - start;
    time elapsedPerIteration = elapsed / 1000000000;
    printf("Time elapsed for each iteration: %d\n", elapsedPerIteration);
    printf("Sum: %d\n", sum); // Added
}

编译器可能足够聪明,可以意识到sum始终是一个常量值,并且优化了所有这些。现在很多人都会对编译器的优化功能感到惊讶。

但是,编译器无法优化的东西呢?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void TestFileOpenPerformance()
{
    FILE* file = NULL;
    time start = GetTime();

    for(int i = 0; i < 1000000000; ++i)
    {
        file = fopen("testfile.dat");
        fclose(file);
    }

    time elapsed = GetTime() - start;
    time elapsedPerIteration = elapsed / 1000000000;
    printf("Time elapsed for each file open: %d\n", elapsedPerIteration);
}

甚至这也不是一个有用的测试!操作系统可能会看到文件被频繁地打开,因此它可能会在内存中预加载它以提高性能。几乎所有的操作系统都这样做。当您打开应用程序时,也会发生同样的情况--操作系统可能会计算出您打开最多的5个应用程序,并在启动计算机时将应用程序代码预加载到内存中!

事实上,有无数变量发挥作用:引用的局部性(例如数组与链表)、缓存和内存带宽的影响、编译器内联、编译器实现、编译器开关、处理器核数、处理器级的优化、操作系统调度器、操作系统后台进程等。

因此,在很多情况下,微基准并不是一个有用的指标。它绝对不会用定义良好的测试用例(分析)取代整个程序的基准测试。首先编写可读代码,然后编写概要文件,看看需要做什么(如果有的话)。

我想强调的是,微基准本身并不是有害的,但人们必须小心使用它们(对于许多其他与计算机有关的事情来说都是这样)。

票数 103
EN

Stack Overflow用户

发布于 2010-05-15 22:30:02

  • 这意味着什么而不是什么意思?

我想说的是,微型基准仅仅意味着测量微小的东西。微型可能与上下文有关,但通常取决于单个系统调用或类似的级别。标杆指的是上面提到的一切。

  • 有哪些例子说明了什么是微观基准,哪些不是?

(归档)文章列出了测量getpid()系统调用的时间,以及使用memcpy()作为微基准测试示例来测量复制内存的时间。

任何对算法、实现等的测量都不能算作微观基准。特别是结果报告,列出执行时间减少的任务,很可能很少被算作微基准。

  • 微基准的危险是什么?你如何避免它?

显而易见的危险是,它诱使开发人员优化程序的错误部分。另一个危险是,要精确地测量一些小的东西是众所周知的困难。避免这种情况的最简单的方法可能是很好地了解在程序中花费的时间最多的地方。

人们通常说“不做微基准测试”,但他们的意思可能是“不要基于微基准做出优化决策”。

  • (或者说这是件好事?)

这本身并不是一件坏事,因为这里的其他人,许多网页似乎表明。它有它的地方。我使用程序重写和运行时方面编织等。我们通常发布添加的指令的微基准,不是为了指导任何优化,而是确保我们的额外代码对重写程序的执行几乎没有影响。

然而,这是一门艺术,特别是在具有JIT、热身时间等的VM环境中。一种描述良好的这里 (归档)方法。

票数 5
EN

Stack Overflow用户

发布于 2016-09-03 07:57:01

“Java性能:最终指南”一书中有关于微基准的定义和例子:

  1. 微基准 微基准测试是一种用于测量非常小的单元性能的测试:调用同步方法的时间与非同步方法的时间;创建线程与使用线程池的开销;执行一个算术algoritm与备用实现的时间;等等。 微基准可能看起来是个好主意,但它们很难正确地编写。考虑下面的代码,它试图编写一个微基准测试一个方法的不同实现的性能,以计算第50个斐波纳契数:

公共doTest(){ double l;long then = System.currentTimeMillis();for(int i= 0;i< nLoops;i++){ l= fibImpl1(50);} long now = system.currentTimeMillis();System.out.println(“运行时间:”+(现在-那时))}.私有双fibImpl1(int ){ if(n < 0)抛出新的IllegalArgumentException(“必须> 0");if(n == 0)返回0d;if(n == 1)返回1d;double d=fibImpl1(n-2)+fibImpl(n-1);if(Double.isInfinited(d))抛出新的ArithmeticException(”溢出“);返回d;}

微基准必须使用它们的结果。

这段代码最大的问题是它从来不改变任何程序状态。由于没有使用Fibonacci计算的结果,所以编译器可以随意放弃该计算,智能编译器(包括当前的Java 7和8编译器)最终将执行以下代码:

长时间= System.currentTimeMillis();长时间= System.currentTimeMillis();System.out.println(“运行时间:”+(现在-那时));

因此,不管Fibonacci方法的实现是什么,或者循环应该执行的次数,经过的时间都只有几毫秒。

有一种方法可以解决这个问题:确保读取每个结果,而不是简单地写入结果。实际上,将l的定义从局部变量更改为实例变量(使用挥发性关键字声明)将允许度量方法的性能。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2842695

复制
相关文章
xp默认管理员账户隐藏问题
很多用户在新装winxp之后没有去创建系统账户,而是使用最高权限的默认管理员账户。
horsley
2022/08/16
6720
gitlab修改管理员用户邮箱
背景: 参照https://www.yuque.com/duiniwukenaihe/znm95g/fmpmzk内网搭建了一台gitlab服务器。嗯 然后我要测试webhook触发jenkins流水线
对你无可奈何
2021/04/30
2.7K0
非 Kubernetes 管理员,清库跑路手册
但是也有可能没那么大权限,那么就试试下面的方法吧。下面的方法依赖于 Docker 的特权模式。
陈少文
2021/01/24
4430
非 Kubernetes 管理员,清库跑路手册
管理员组的非Administrator用户有时候改不了hosts
有时候系统有特殊配置,可能Administrators组的非Administrator用户打开的cmd不对(不是以管理员身份打开的),通过命令行改或直接去改C:\Windows\System32\drivers\etc\hosts,都改不了
Windows技术交流
2022/09/20
7290
给当前用户添加管理员权限
在打开的对话框中输入管理员组“administrators”,并单击“检查名称”按钮,如下图:
wsuo
2020/07/31
3.3K0
给当前用户添加管理员权限
Discourse 如何指派用户管理员权限
但是 Discourse 的管理员用户组是没有办法从用户组上添加用户的,你需要登录 Discourse 的后台后,找到你希望指派的用户,然后将这个用户指定为管理员。
HoneyMoose
2020/10/21
1.9K0
Discourse 如何指派用户管理员权限
mac用户丢失管理员身份急救
用了这么久mac,发现居然还存在这么大一个bug。就是如果你曾经编辑mac电脑默认用户资料,比如试图改用户名、试图改HOME路径之类的,有很高比率可能导致该用户丧失管理员权限。 随后悲剧就开始了,所有需要管理员权限认证的地方,比如安装了一个新软件,在弹出的认证窗口中,无论如何输入用户名和密码,都无法授权通过。此时在系统设置->用户及用户组中,会发现该用户选项卡中“允许用户管理这台电脑”前面的勾选已经不见了。当然这时候因为无法授权修改用户权限,因此也无法重新勾选上这个选项。 解决方法一: 这个是通常的
俺踏月色而来
2018/06/15
3.4K0
Oracle 数据库管理员及管理员的作用
以下测试实例均在Oracle11gr2下测试!!! 一、简介:每个Oracle数据库应该至少有一名数据库管理员(dba),对于一个小的数据库,一个dba就够了,但是对于一个大的数据库,可能需要多个dba分担不同的管理职责,以下是一个数据库管理员的工作职责: 1、安装和升级Oracle数据库 2、建库、表空间、表、视图、索引等常用的数据对象 3、制定并实施备份与恢复计划 4、数据库权限管理,调优,故障排除 5、对于高级dba,要求能参与项目开发,会编写sql语句、存储过程、触发器、规则、约束、包等 二、Ora
郑小超.
2018/01/26
1.8K0
Windows 下使用 runas 命令以指定的权限启动一个进程(非管理员、管理员)
在默认情况下,Windows 系统中启动一个进程会继承父进程的令牌。如果父进程是管理员权限,那么子进程就是管理员权限;如果父进程是标准用户权限,那么子进程也是标准用户权限。
walterlv
2023/10/22
7.2K0
Windows 下使用 runas 命令以指定的权限启动一个进程(非管理员、管理员)
绕过反病毒添加管理员用户小结
我们在后渗透中时常会遇到这样的环境,即使成功拿到了目标机器的Admin/System权限后也不能添加用户和管理员组,出现这种情况的原因有很多,如:UAC、WAF、反病毒软件或者是net.exe降权和安全组策略中的软件限制、应用程序控制策略等。
潇湘信安
2021/01/22
3.3K0
绕过反病毒添加管理员用户小结
WordPress中判断用户是不是管理员
今天在写个小程序,需要判断指定用户的角色是不是网站管理员,如知道用户的id是123,想要知道他是不是管理员。
主机优惠教程
2022/04/09
8750
获取域内管理员和用户信息
如果我们拿到了一台普通用户权限的windows计算机,想要在内网中横向移动,需要知道域内用户登录的位置,是否是本地管理员,他的组,是否有权访问文件共亨等等。
黑白天安全
2020/07/30
8.1K0
获取域内管理员和用户信息
红队战术-从域管理员到企业管理员
一个企业的整个网络划分是非常巨大了,甚至有多个林,而这个域森林权力最大还属企业管理员了,当我们拿到一个域的dc的时候,当然不是红队的终点,我们的最终的目标是企业管理员,只要我们拿下了企业管理员,整个企业内网才算真正拿下。
Gamma实验室
2021/07/01
1.1K0
启动管理员进程
当我们运行一个程序的时候有时需要提升到管理员权限,但是默认的C#程序的运行权限是当前用户的权限,那么怎么提升这个启动权限呢?
用户1175783
2019/09/18
7880
动物管理员 --- zookeeper
简单地说就是管理员。有什么事它就会通知到所有被它管理的人。就比如宿舍管理员,宿舍要停电他就会发通知,然后所有住这栋楼的都会知道。说专业一点,它是由文件系统和通知机制组成的。
贪挽懒月
2020/01/15
7480
动物管理员 --- zookeeper
功能亮点:CPU管理员
作者:Balaji Subramaniam(英特尔),Connor Doyle(英特尔)
CNCF
2019/12/05
6080
Jenkins修改管理员密码.
前言:Jenkins修改管理员密码,我看了网上所有的教程,竟然全都是拿着一串已经加密好的111111的密文去替代config.xml文件里面的密码,然后大家的密码都是111111!我觉得这种做法实在太敷衍了!于是我就研究了下,包括Jenkins密码的加密方式,以及如何修改管理员的密码,当然,通过配置Jenkins允许注册用户,去注册一个用户,也不失为一个好选择。 1、Jenkies的加密方式 Jenkins的密码采用的是Java加解密工具 jBCrypt,我也是第一次接触到这种加密方式,实在被他惊叹到
JMCui
2018/03/15
2K0
Jenkins修改管理员密码.
gitlab重置管理员密码
在公司内,所有的代码业务都是部署在gitlab搭建的内网仓库中的,但是一次断电后,我忘记了管理密码,其余人的密码也忘记了想要重置,但是邮件都是默认的,没有设置自己的邮件,所以只能我在后台操作 忘记gitlab管理账号密码时候的解决方案: > 在服务器终端输入 gitlab-rails console production > 进入到git shell中输入 user = User.where(id:1).first user.password = 'Your password' user.save
简单、
2018/06/21
1.8K0
网站管理员工具简介
在众多谷歌网站管理员工具指南资料中,能够视频和文字结合实操的为数不多。本博主在咨询培训过程中经常碰到不会使用谷歌网站管理员工具的,为了谷歌SEO用户提供最好地使用网站管理员工具专门推出此系列指南。
林雍岷
2019/07/03
9980
MySQL管理员密码重设
输入:mysqld --defaults-file="MySQL地址加\my.ini" --init-file="文件地址" --console
Breeze.
2022/05/01
1.4K0
MySQL管理员密码重设

相似问题

sharepoint隐藏非管理员的管理员标题

20

非管理员用户显示隐藏项

23

SQL条件,管理员用户与非管理员用户

221

通过管理员或非管理员

11

向非管理员的用户隐藏的新闻源

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文