Questions tagged «performance»

与提高应用程序性能有关的问题可能涉及从选择软件体系结构到算法选择的范围。

14
为什么这么多开发人员认为性能,可读性和可维护性不能共存?
在回答这个问题时,我开始怀疑为什么这么多的开发人员认为好的设计不应该考虑性能,因为这样做会影响可读性和/或可维护性。 我相信,一个好的设计在编写时也要考虑性能,并且一个好的设计的优秀开发人员可以编写一个高效的程序,而不会对可读性或可维护性产生不利影响。 尽管我承认存在极端情况,但为什么许多开发人员坚持认为高效的程序/设计将导致较差的可读性和/或较差的可维护性,因此,性能不应作为设计考虑因素?

4
适用于C,C ++等的JIT编译器
是否有针对C和C ++等已编译语言的即时编译器?(想到的第一个名字是Clang和LLVM!但是我不认为它们目前支持它。) 说明: 我认为该软件可以受益于运行时性能分析反馈以及在运行时对热点进行积极优化的重新编译,即使对于C和C ++等编译为机器的语言也是如此。 概要文件引导的优化可以完成类似的工作,但是不同的是,JIT在不同的环境中会更加灵活。在PGO中,您在运行二进制文件之前先运行它。发行后,它将不会在运行时收集任何环境/输入反馈。因此,如果更改输入模式,则可能会降低性能。但是,即使在这种情况下,JIT也能很好地工作。 但是,我认为JIT编译性能的好处是否超过其自身的开销是有争议的。

1
SQLite数据库的实际最大实际大小是多少?
根据有关SQLite适当用法的这篇文章,它说,尽管SQLite的限制为140 TB,但客户端/服务器RDBMS可能会更好地工作: SQLite数据库的大小限制为140 TB(2 47字节,128 TB)。即使可以处理更大的数据库,SQLite也会将整个数据库存储在单个磁盘文件中,而许多文件系统将文件的最大大小限制为小于此大小。因此,如果您正在考虑这种规模的数据库,那么最好考虑使用一个客户机/服务器数据库引擎,该引擎将其内容分布在多个磁盘文件中,甚至可能分布在多个卷中。 总的来说,我同意这一点,但是得知SQLite的最大限制如此之高,我感到很惊讶!根据我的经验,我已经使用了许多SQL Server数据库,其大小约为30-100GB。我还间接使用Oracle,Postgres或Cassandra处理更大的数据库。其中,至少就我所知,没有一个接近140TB。我不是DBA,因此根据我的直接经验,我认为这是“大笔”的事情。 对于数据库很小的情况,我只考虑过SQLite。最多几十兆。 阅读本文后,我仍然不相信要考虑将SQLite用于可能需要数百GB数据的任何事情。但是我想知道我是否一直在低估它的功能。在实际使用中,SQLite数据库的实际最大大小限制是多少?

7
用C语言编写性能?[关闭]
我知道我经常听到C通常比C ++具有性能优势。在我意识到MSVC似乎甚至不支持C的最新标准之前,我并没有真正想到它,但据我所知,最新的版本支持C99。 我打算编写一个包含一些代码的库以在OpenGL中呈现,以便我可以重用它。我打算用C语言编写该库,因为在图形方面,任何性能的提高都是值得欢迎的。 但这真的值得吗?使用该库的代码很可能是用C ++编写的,而我通常更喜欢用C ++编写代码。 但是,如果产生的性能差异很小,我可能会选择C。 可能还需要注意的是,这个库将是我可以在Windows / OS X / Linux上使用的库,并且我很可能会原生编译所有内容(Windows的MSVC,OS X的Clang或GCC以及Linux的GCC。 。或可能是英特尔的所有编译器)。 我环顾四周,并找到了一些基准测试等,但是我所看到的所有内容都是针对GCC而不是MSVC和Clang的。此外,基准测试未提及所用语言的标准。有人对此有任何想法吗? 编辑:经过几年的经验,我只是想分享我对这个问题的观点。我最终用C ++编写了一个问这个问题的项目。我大约在同一时间在C中启动了另一个项目,因为我们希望获得尽可能少的性能,并且需要该项目在C中可链接。几个月前,我到达了真正需要地图和高级界面的地步字符串操作。我知道C ++标准库中的这种功能,并最终得出结论:标准库中的那些结构可能会比在合理的时间内可以在C中实现的映射和字符串更好并且更稳定。通过向C ++代码编写C接口,可以很容易地满足在C中可链接的要求,该接口可以通过不透明类型快速完成。用C ++重写库似乎比用C编写库快得多,而且不容易出现错误,尤其是内存泄漏。我还能够使用标准库线程库,该库比使用特定于平台的实现要容易得多。最后,我相信用C ++编写库可以带来巨大的好处,而性能成本可能很小。我尚未对C ++版本进行基准测试,但是我认为使用标准库数据结构可能会获得比我编写的性能更高的性能。我相信用C ++编写库可以带来巨大的好处,而性能成本可能很小。我尚未对C ++版本进行基准测试,但是我认为使用标准库数据结构可能会获得比我编写的性能更高的性能。我相信用C ++编写库可以带来巨大的好处,而性能成本可能很小。我尚未对C ++版本进行基准测试,但是我认为使用标准库数据结构可能会获得比我编写的性能更高的性能。

2
如何设计可扩展的通知系统?[关闭]
我需要写一个通知系统管理员。 这是我的要求: 我需要能够在可能完全不同的不同平台上发送通知(例如,我需要能够发送SMS或电子邮件)。 有时,对于给定平台的所有收件人,通知可能是相同的,但是有时,可能是每个平台(或多个)每个收件人的通知。 每个通知可以包含特定于平台的有效负载(例如,MMS可以包含声音或图像)。 系统需要可伸缩,我需要能够发送大量通知而不会导致应用程序或服务器崩溃。 这是一个分为两个步骤的过程,首先,客户可以输入消息并选择要发送到的平台,然后创建通知,以便稍后进行实时处理。 然后,系统需要将通知发送到平台提供商。 就目前而言,尽管我得到了一些结论,但是我不知道它的可扩展性或它是否是一个好的设计。 我有以下对象(使用伪语言): 通用Notification对象: class Notification { String $message; Payload $payload; Collection<Recipient> $recipients; } 如果我有1.000.000收件人,则以下对象的问题是什么?即使Recipient对象很小,也会占用太多内存。 我还可以为每个收件人创建一个通知,但是某些平台提供商要求我批量发送该通知,这意味着我需要定义一个包含多个收件人的通知。 每个创建的通知可以存储在诸如DB或Redis的持久性存储中。 稍后汇总此内容以确保其可伸缩性是否很好? 在第二步中,我需要处理此通知。 但是,如何区分通知给正确的平台提供商的通知呢? 我应该使用诸如MMSNotification扩展对象之类的对象abstract Notification吗?或类似的东西Notification.setType('MMS')? 为了允许同时处理大量通知,我认为像RabbitMQ这样的消息传递队列系统可能是正确的工具。是吗? 这将使我可以排队很多通知,并有几个工作人员弹出通知并进行处理。但是,如果我需要如上所述对收件人进行批处理怎么办? 然后我想象NotificationProcessor的,我我可以添加对象NotificationHandler的每个NotificationHandler将负责连接平台提供商和执行通知。 我也可以使用EventManager允许插入行为。 有任何意见或建议吗? 感谢您抽出宝贵的时间。 注意:我曾经使用过PHP,并且它可能是我选择的语言。 编辑 (根据morphunreal的答案) 您每秒发送多少消息(定义当前/初始级别,定义在重新设计之前系统应处理的最大级别) 系统具有哪些硬件限制(内存,CPU等可供系统使用) 硬件将如何扩展(即添加更多服务器,云计算等) 哪些语言/系统将生成通知? 它是我自己的事情,我负责以编程方式创建通知,但该通知是通过用户界面构建的。 生成器是否知道消息的收件人(?),还是通过其他某种方式提供消息(例如,某些警报类型的业务规则将发送给某些收件人) 应该可以为特定收件人,一组收件人(例如,使用标签系统)或整个平台创建通知。 是否有添加CC / BCC /阅读收据的业务规则 是。请注意,这实际上是特定于平台的,read或cc并非在所有平台上都可用。 …

10
在C ++中对向量使用列表的意义是什么?
我已经运行了3个涉及C ++列表和向量的不同实验。 事实证明,即使在中间涉及很多插入操作,带有向量的操作也更加有效。 因此,出现了一个问题:在哪种情况下列表比矢量有意义? 如果向量在大多数情况下似乎更有效率,并考虑其成员的相似程度,那么列表还有哪些优势? 生成N个整数并将其放入容器中,以便容器保持排序状态。通过逐个读取元素并在第一个较大的元素之前插入新的元素,已天真地执行了插入操作。 与向量相比,有了清单,尺寸增加时,时间就会流逝。 在容器的末尾插入N个整数。 对于列表和向量,时间增加了相同的数量级,尽管向量快3倍。 在容器中插入N个整数。 启动计时器。 使用list.sort来排序容器,使用std :: sort来对容器进行排序。停止计时器。 同样,时间以相同的数量级增加,但使用向量平均要快5倍。 我可能会继续进行测试,并找出几个清单可以证明更好的例子。 但是你们阅读此消息的共同经验可能会提供更有成效的答案。 您可能遇到过这样的情况,其中列表更易于使用或执行得更好?

8
是什么导致消费者应用程序的性能下降?[关闭]
我的Comcast DVR至少需要三秒钟才能响应每次远程控制按键,使看电视的简单任务变成令人沮丧的按钮混搭体验。我的iPhone至少需要15秒才能显示短信,并且在尝试启动iPod应用程序时崩溃1/4。仅接收和阅读电子邮件通常需要一分钟以上的时间。甚至我车中的navcom都具有糊状且反应迟钝的控件,如果我将连续的输入间隔不超过几秒钟,它们通常会吞咽。 这些都是固定硬件最终消费者设备,其可用性应该是最重要的,但是它们都在基本的响应速度和延迟方面都失败了。他们的软件太慢了。 这背后是什么?是技术问题还是社会问题?谁或什么负责? 是否因为它们都是用托管的垃圾收集语言而不是本机代码编写的?是为这些设备编写软件的个人程序员吗?在所有这些情况下,应用程序开发人员都确切知道他们所针对的硬件平台以及其功能是什么。他们没有考虑到这一点吗?难道是那个反复说“优化是万恶之源”的家伙,他使他们误入歧途了吗?直到所有这些毫秒数累加起来才是每次都会“额外增加100毫秒”的心态吗?首先购买这些产品是我的错吗? 这是一个主观的问题,有没有唯一的答案,但我经常受挫在这里看到这么多回答说:“哦,不用担心代码的运行速度,性能并不重要,”在某个时候,当清楚地做事情了陷入缓慢,反应迟钝,糟糕的体验的最终用户。 那么,这些产品在什么时候出问题了?作为程序员,我们如何做才能避免给我们自己的客户造成这种痛苦?

18
开发团队如何防止消费者应用程序的性能下降?
当我之前询问造成缓慢软件的原因是什么时,我收到的一些答案表明这是一个社会和管理问题: 这不是技术问题,而是市场营销和管理问题。...最好,产品经理负责编写用户应获取的规格。许多事情可能会出错:产品经理无法在规范中添加按钮响应...质量检查人员会根据该规范进行中等程度的测试...如果产品管理人员和质量检查人员都睡着了,我们程序员无法弥补这一点。- 鲍勃·墨菲 人们使用大型应用程序工作。当它们起作用时,就像漏洞一样,性能问题会逐渐蔓延。区别在于-错误是“不好的”-他们大喊“发现我并修复我”。性能问题只会摆在那儿,并且变得更糟。程序员经常认为“好吧,我的代码不会出现性能问题。相反,管理层需要给我买一台更新/更大/更快的机器。” 事实是,如果开发人员定期只是寻找性能问题(这实际上很容易),他们可以简单地将其清除。— Mike Dunlavey 因此,如果这是一个社会问题,那么组织可以采用哪些社会机制来避免将缓慢的软件交付给客户?
32 performance  ui 

6
为什么实践中quicksort比其他排序算法更好?
这是Janoma对cs.SE的一个问题的转贴。对他或CS SE的全部荣誉和破坏。 在标准算法课程中,我们学会了快速排序平均为O(n log n),在最坏情况下为O(n²)。同时,还研究了其他排序算法,它们在最坏的情况下为O(n log n)(例如mergesort和heapsort),在最坏的情况下甚至是线性时间(例如bubbleort),但还有一些额外的内存需求。 快速浏览一下更多的运行时间后,自然可以说quicksort 应该不如其他高效。 另外,考虑到学生在基础编程课程中学习到,递归通常并不太好,因为它会占用过多的内存,等等。因此(尽管这不是一个真正的论点),但这样的想法是快速排序可能不是真的很好,因为它是一种递归算法。 那么,为什么在实践中快速排序优于其他排序算法?它与真实数据的结构有关吗?它与计算机中内存的工作方式有关吗?我知道有些记忆要比其他记忆快,但是我不知道这是否是这种违反直觉的表现的真正原因(与理论估计相比)。

2
编写低延迟的Java
是否存在用Java编写低延迟代码的特定于Java的技术(不适用于C ++的技术)?我经常看到Java低延迟角色,并且他们要求获得编写低延迟Java的经验-有时似乎有点矛盾。 我唯一能想到的就是JNI的经验,将I / O调用外包给本地代码。也可能使用破坏者模式,但这不是实际技术。 有编写低延迟代码的Java特定技巧吗? 我知道有一个实时Java规范,但是我被警告实时与低延迟不一样。

10
Java中的模板“元编程”是个好主意吗?
在一个相当大的项目中有一个源文件,它具有几个对性能极为敏感的功能(每秒被称为百万次)。实际上,先前的维护者决定编写一个函数的12个副本,每个副本的差别都很小,以节省在单个函数中检查条件的时间。 不幸的是,这意味着代码是要维护的PITA。我想删除所有重复的代码,只写一个模板。但是,Java语言不支持模板,我不确定泛型是否适合于此。 我目前的计划是写一个文件,该文件生成该函数的12个副本(实际上是一个只能使用的模板扩展器)。对于为什么必须以编程方式生成文件,我当然会提供很多解释。 我担心的是,这将导致将来的维护人员感到困惑,并且如果他们在修改文件后忘记重新生成文件,或者(如果更糟糕的话)他们以编程方式生成的文件进行修改,则可能会引入讨厌的错误。不幸的是,除了没有用C ++重写整个过程外,我看不到任何解决方法。 这种方法的好处是否大于缺点?我应该改为: 发挥性能优势,并使用单个可维护的功能。 添加有关为何必须重复执行该功能12次的说明,并应承担维护负担。 尝试将泛型用作模板(它们可能无法那样工作)。 大吼大叫的老维护者,使代码的性能取决于单个函数。 其他保持性能和可维护性的方法? PS:由于该项目的设计不佳,对功能进行性能分析非常棘手……但是,这位前维护人员说服了我,性能下降是不可接受的。我认为他的意思是超过5%,尽管这完全是我的猜测。 也许我应该详细说明一下。这12份副本执行的任务非常相似,但差别很小。在整个函数中的不同地方存在差异,因此不幸的是,有很多很多条件语句。有效地有6种“操作模式”和2种“范例”(由我自己编造的词)。要使用该功能,可以指定操作的“模式”和“范例”。这从来都不是动态的。每段代码仅使用一种模式和范例。所有12个模式范例对都在应用程序中的某个位置使用。这些函数恰当地命名为func1到func12,偶数代表第二个范例,奇数代表第一个范例。 我知道,如果以可维护性为目标,那将是最糟糕的设计。但是它似乎“足够快”,并且这段代码已经有一段时间不需要任何更改了。也值得注意的是原始功能尚未删除(尽管据我所知这是无效代码) ,因此重构将很简单。

15
在现代计算时代,在“典型业务应用程序”中-为什么性能很重要?[关闭]
对于某些人来说,这似乎是一个奇怪的问题。 我是一名业余Java程序员。我已经开发了几个游戏,一个可以创建音乐的AI程序,另一个用于绘画的程序以及类似的东西。这是要告诉您,我有编程经验,但是没有业务应用程序的专业开发经验。 我在这个网站上看到了很多有关性能的话题。人们经常争论什么是C#中执行任务的最有效算法,或者为什么Python速度慢而Java速度更快等。 我想了解的是:为什么这很重要? 在某些特定的计算领域中,我明白了性能为何如此重要:游戏,在一个恒定更新循环中每秒发生成千上万次计算,或者其他程序所依赖的低级系统,例如OS和VM等。 但是对于普通的,典型的高级商务应用程序,为什么性能很重要? 我能理解几十年前为什么如此重要。计算机的速度要慢得多,内存也要少得多,因此您必须仔细考虑这些事情。 但是今天,我们有太多的可用内存可供使用,并且计算机是如此之快:如果特定的Java算法为O(n ^ 2),这实际上有关系吗?对于这个典型的商业应用程序的最终用户而言,这实际上会有所不同吗? 在现代计算的当今时代,当您在典型的业务应用程序中按GUI按钮并在后台调用O(n ^ 2)算法时,您实际上是否感到效率低下? 我的问题分为两部分: 在实践中,今天的业绩对典型的正常业务计划是否重要? 如果是这样,请给我提供此类应用程序中性能和优化很重要的位置的真实示例。

10
简单vs复杂(但性能高效)解决方案-选择哪个,何时选择?
我已经编程了两年,经常发现自己陷入了困境。 有两种解决方案- 一种是简单的,即简单的方法,易于理解和维护。它涉及一些冗余,一些额外的工作(额外的IO,额外的处理),因此不是最佳的解决方案。 但是其他方法则使用复杂的方法,难以实现,通常涉及许多模块之间的交互,是一种高效的解决方案。 当我没有硬性能SLA甚至简单的解决方案都可以满足性能SLA时,我应该争取哪种解决方案?我对开发人员的简单解决方案不屑一顾。 如果您的性能SLA可以通过一个简单的解决方案来解决,那么提出最佳最佳复杂解决方案是一种好习惯吗?

3
如何有效地存储大时间序列数据?
我需要存储并能够查询一些非常大的时间序列数据。 数据的属性如下: 系列数:约12.000(1.2万) 全球数据点数量:每月约5000亿(五亿) 混合值类型:大多数数据点为浮点值,其余为字符串 采样周期:系列之间以及系列内的变量 时间戳:毫秒精度 数据保留期:数年,无衰减或下采样 数据存档需要近乎实时地构建,但是可以接受合理的延迟(〜1小时) 如果需要,可以重建过去的数据,但是成本很高 有时(但很少),需要更新一些过去的数据 预想查询的属性: 针对数据的大多数查询将是基于时间戳的查询;从一天到几个月/年不等。90%以上将是对最新数据的查询 其他需求: 解决方案必须像免费啤酒一样免费,最好是开源的 我最初的想法是将带有HDF5文件的 PyTables / Pandas 用作存储后端,而不是SQL数据库。 问题: 假设PyTables / Pandas是“最佳”途径,将数据拆分成多个HDF文件,每个文件跨越一个给定的时间,还是将所有内容都放入一个单独的文件中,然后再变得庞大会更好吗? 我应该选择固定格式还是表格格式?对我来说,如果我每月保留一个HDF文件,则固定格式看起来还可以,因为这样一来,整个系列就可以放入RAM中,并且可以在内存中切片而不需要表格式索引。我对么 ? 如果那不是最好的方法,那么我应该如何构造该数据存储或应该考虑哪些技术?我不是第一个处理存储大量时间序列数据的人,解决此难题的一般方法是什么? 我考虑过的其他方法: 数组数据库:它们非常适合具有恒定采样周期的时间序列,因为您只需要存储数组的开始和结束时间以及采样周期,然后只需要数组本身中的值和索引即可。但是,由于序列本身具有可变的采样周期,因此我需要保持更紧密的timestamp-> value关系,我认为这不太适合数组DBMS。 标准SQL数据库,其中带有时间戳,paramID,值作为列,但根据其性质,它们为任何查询都请求大量磁盘I / O

4
为什么每次重新启动后,我的本地.NET站点都需要一些时间才能首次加载?[关闭]
我正在开发基于.NET平台的网站。我通常将这些站点部署在本地IIS上,以便在上线之前对其进行测试并查看其功能。但是,每次我重新启动Windows时,站点似乎都需要很长时间才能首次运行。 我了解JIT,也知道这个问题,但是它不能回答我的问题。 每次重新启动Windows都会发生JIT吗?它与w3wp.exe进程的创建有关吗?为什么站点在每次重新启动后对第一个请求的响应如此缓慢?
27 .net  asp.net  performance  iis  jit 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.