墨非定律是啥
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了墨非定律是啥相关的知识,希望对你有一定的参考价值。
“墨菲定律”(Murphy\'s Law)亦称莫非定律、莫非定理、或摩菲定理,是西方世界常用的俚语。“墨菲定律”:事情往往会向你所想到的不好的方向发展,只要有这个可能性。比如你衣袋里有两把钥匙,一把是你房间的,一把是汽车的;如果你现在想拿出车钥匙,会发生什么?是的,你往往是拿错了房间钥匙。
这就是著名的“墨菲定律”。
墨菲是美国爱德华兹空军基地的上尉工程师。1949年,他和他的上司斯塔普少校,在一次火箭减速超重试验中,因仪器失灵发生了事故。墨菲发现,测量仪表被一个技术人员装反了。由此,他得出的教训是:如果做某项工作有多种方法,而其中有一种方法将导致事故,那么一定有人会按这种方法去做。
换种说法:假定你把一片干面包掉在地毯上,这片面包的两面均可能着地。但假定你把一片一面涂有一层果酱的面包掉在地毯上,常常是带有果酱的一面落在地毯上。在事后的一次记者招待会上,斯塔普将其称为“墨菲法则”,并以极为简洁的方式作了重新表述:凡事可能出岔子,就一定会出岔子。墨菲法则在技术界不胫而走,因为它道出了一个铁的事实:技术风险能够由可能性变为突发性的事实。
墨菲定律的适用范围非常广泛,它揭示了一种独特的社会及自然现象。它的极端表述是:如果坏事有可能发生,不管这种可能性有多小,它总会发生,并造成最大可能的破坏。
“墨菲定律”、“帕金森定律”和“彼德原理”并称为二十世纪西方文化三大发现。
西方的“墨菲定律”(Murphy\'s Law)是这样说的:Anything that can go wrong will go wrong. :“凡事只要有可能出错,那就一定会出错。”
“墨菲定律”的原话是这样说的:If there are two or more ways to do something, and one of those ways can result in a catastrophe, then someone will do it.(如果有两种或两种以上的方式去做某件事情,而其中一种选择方式将导致灾难,则必定有人会作出这种选择。)
根据“墨菲定律”:
一、任何事都没有表面看起来那么简单;
二、所有的事都会比你预计的时间长;
三、会出错的事总会出错;
四、如果你担心某种情况发生,那么它就更有可能发生。 参考技术A 墨菲定律是一种心理学效应,由爱德华·墨菲(Edward A. Murphy)提出的,亦称墨菲法则、墨菲定理。
墨菲定律的原句是:如果有两种或两种以上的方式去做某件事情,而其中一种选择方式将导致灾难,则必定有人会做出这种选择。
墨菲定律根本内容是:如果事情有变坏的可能,不管这种可能性有多小,它总会发生。
主要内容:一、任何事都没有表面看起来那么简单;二、所有的事都会比你预计的时间长;三、会出错的事总会出错;四、如果你担心某种情况发生,那么它就更有可能发生。 参考技术B “墨菲定律”是一种心理学效应。
他的主要内容是:
一、任何事都没有表面看起来那么简单;
二、所有的事都会比你预计的时间长;
三、会出错的事总会出错;
四、如果你担心某种情况发生,那么它就更有可能发生。 参考技术C 墨菲定律的原句是:如果有两种或两种以上的方式去做某件事情,而其中一种选择方式将导致灾难,则必定有人会做出这种选择。墨菲定律根本内容是:如果事情有变坏的可能,不管这种可能性有多小,它总会发生。主要内容:一、任何事都没有表面看起来那么简单;二、所有的事都会比你预计的时间长;三、会出错的事总会出错;四、如果你担心某种情况发生,那么它就更有可能发生。 参考技术D 凡是可能出错的事有很大几率会出错,任何一个事件,只要具有大于零的机率,就不能够假设它不会发生。
您的 Java 低延迟应用程序的开发清单是啥?
【中文标题】您的 Java 低延迟应用程序的开发清单是啥?【英文标题】:What is your development checklist for Java low-latency application?您的 Java 低延迟应用程序的开发清单是什么? 【发布时间】:2011-02-04 04:46:01 【问题描述】:我想为 Java 低延迟应用程序创建综合清单。您可以在此处添加您的清单吗?
这是我的清单 1. 让你的对象不可变 2.尽量减少同步方法 3. 锁定订单应有据可查,并谨慎处理 4. 使用分析器 5. 使用 Amdhal 定律,找到顺序执行路径 6. 使用 Java 5 并发实用程序和锁 7. 避免线程优先级,因为它们依赖于平台 8. 可以使用JVM预热 9. 更喜欢不公平的锁定策略 10. 避免上下文切换(许多线程会导致适得其反) 11. 避免装箱、拆箱 12. 注意编译器警告 13.线程数应等于或小于内核数
每毫秒调整一次低延迟应用程序。
【问题讨论】:
许多人编写响应时间远低于 1 毫秒的低延迟 Java 应用程序。对我来说,Java 中的低延迟意味着亚毫秒级。 "6. 使用锁" => 甚至更好,尝试让你的算法无锁。 (A) 锁定还不错,争用才是。了解如何避免争用(如果争用 CAS,无锁可能会更糟)。 (B) 利特尔定律。 (C) 围绕 CPU 缓存进行优化 【参考方案1】:虽然不变性很好,但不一定会改善延迟。确保低延迟可能取决于平台。
除了一般性能之外,GC 调优也很重要。减少内存使用将有助于 GC。特别是如果你可以减少需要移动的中年对象的数量 - 让它保持长期或短期的对象。还要避免任何接触烫发的东西。
【讨论】:
Hawtin,当您不必围绕共享数据进行同步时,使用不可变数据结构是否有助于延迟? 这可能是这里最好的答案【参考方案2】:避免装箱/拆箱,尽可能使用原始变量。
【讨论】:
【参考方案3】:在消息处理路径上尽可能避免上下文切换 后果:使用 NIO 和单事件循环线程(reactor)
【讨论】:
【参考方案4】:购买、阅读并了解Effective Java。还有available online
【讨论】:
【参考方案5】:避免大量锁定和多线程,以免破坏现代处理器(及其缓存)中的增强功能。然后,您可以使用单线程达到令人难以置信的极限(每秒 600 万次事务),并且延迟非常低。
如果您想查看真实世界的低延迟 Java 应用程序,并了解其架构的足够详细信息,请查看 LMAX:
The LMAX Architecture
【讨论】:
【参考方案6】:测量,测量和测量。使用尽可能接近真实数据和接近生产硬件的数据来定期运行基准测试。低延迟应用程序通常被更好地视为设备,因此您需要考虑部署的整个盒子,而不仅仅是特定的方法/类/包/应用程序/JVM 等。如果您没有在生产环境等设置上构建现实的基准测试,您将在生产。
【讨论】:
【参考方案7】:在您的应用程序中调度的线程数不要超过底层硬件上的内核数。请记住,操作系统将需要线程执行,并且可能需要其他服务共享相同的硬件,因此您的应用程序可能需要使用少于可用内核的最大数量。
【讨论】:
这适用于计算密集型任务,不一定适用于具有更多线程有意义的阻塞/IO/其他任务。如果您有更多线程然后是内核,那么您将需要“聚集”它们,以便计算密集型线程与阻塞线程分开固定。【参考方案8】: 考虑使用非阻塞方法而不是同步。 考虑在阻塞数据结构和锁上使用易失性或原子变量。 考虑使用对象池。 使用数组而不是列表,因为它们对缓存更友好。 由于锁定以及内存和缓存访问延迟,通常对于将数据发送到其他内核的小型任务可能比在单个内核上处理需要更多时间。因此,请考虑通过单个线程处理任务。 降低访问主存的频率,并尝试使用缓存中存储的数据。 考虑选择专注于性能优化的服务器端 C2 JIT 编译器,而不是专注于快速启动时间的 C1。 当不同线程使用的两个字段可以位于单个缓存行上时,请确保您没有错误的对象字段共享。 阅读https://mechanical-sympathy.blogspot.com/ 考虑使用 UDP over TCP【讨论】:
【参考方案9】:在生成大字符串时使用StringBuilder
而不是String
。例如查询。
【讨论】:
只有当你想用字符串做某事时才有意义,例如连接其他字符串或反转等。 通常没有区别。 Java 编译器为字符串连接生成的字节码使用 StringBuilders! 循环(或多个语句)中的连接是显式StringBuilder
获胜的常见情况。【参考方案10】:
另一个重要的想法是首先让它工作,然后测量性能,然后隔离任何瓶颈,然后优化它们,然后再次测量以验证改进。
正如 Knuth 所说,“过早的优化是万恶之源”。
【讨论】:
很少有应用程序的成功或失败只取决于性能。尽管过早优化是错误的,但该规则不适用于每个应用程序。低延迟应用程序的构建必须遵循一定的准则。 我一直喜欢“先让它工作,然后再让它快速工作”。 我想记住,话虽如此,Knuth 将大部分时间都献给了算法效率。 :) 牢记完整的引用:“我们应该忘记小的效率,比如大约 97% 的时间:过早的优化是万恶之源。但我们不应该放弃我们的机会关键的 3%。”【参考方案11】:我认为“仅在适当的情况下使用可变对象”比“使您的对象不可变”更好。许多非常低延迟的应用程序都有他们重用的对象池以最小化 GC。不能以这种方式重用不可变对象。例如,如果您有一个 Location 类:
class Location
double lat;
double lon;
您可以在启动时创建一些并反复使用它们,这样它们就不会导致分配和随后的 GC。
虽然这种方法比使用不可变的位置对象要复杂得多,所以它应该只在需要的地方使用。
【讨论】:
【参考方案12】:除了这里已经推荐的开发人员级解决方案之外,考虑加速 JIT 运行时(例如 Zing)和堆外内存解决方案(如 Teracotta BigMemory、Apache Ignite)也非常有益,以减少 Stop-the-world GC 暂停。 如果某些 GUI 涉及使用像 Hessian 这样的二进制协议,ZERO-C ICE 而不是 webservice 等是非常有效的。
【讨论】:
以上是关于墨非定律是啥的主要内容,如果未能解决你的问题,请参考以下文章