Questions tagged «optimization»

优化是改进现有程序以使其更有效地工作和/或使用较少资源的过程。


4
面向数据的设计-不超过1-2个结构“成员”不切实际?
数据导向设计的常见示例是Ball结构: struct Ball { float Radius; float XYZ[3]; }; 然后他们提出了一种迭代std::vector<Ball>向量的算法。 然后它们给您同样的东西,但是在面向数据的设计中实现: struct Balls { std::vector<float> Radiuses; std::vector<XYZ[3]> XYZs; }; 这样做很好,而且如果您要先迭代所有半径,然后遍历所有位置,依次类推,那么一切都很好。但是,如何移动矢量中的球?在原始版本中,如果您有std::vector<Ball> BallsAll,则可以将任何移动BallsAll[x]到任何一个BallsAll[y]。 但是,对于面向数据的版本,要对每个属性执行相同的操作(对于Ball,则必须执行两次(半径和位置)。但是,如果您拥有更多的属性,情况会变得更糟。您必须为每个“球”保留一个索引,并且在尝试移动它时,必须在每个属性向量中进行移动。 这不会破坏面向数据设计的任何性能优势吗?

7
使用HTML5本地存储来存储CSS和JavaScript是否现实
这个想法是利用HTML5本地存储来存储经常访问的CSS和JavaScript。 例如(伪代码): var load_from_cdn = true; 如果(检测本地存储) { 如果(找到CSS,JS的缓存) { 加载本地存储缓存 load_from_cdn = false; } } 如果(load_from_cdn) { document.write('<script> ...'); } 这是可能的还是现实的? 我知道浏览器缓存,但仍然会进行一些标头访问检查, 我认为没有HTTP访问会更好(我认为) PS:本地存储似乎仅支持键值对,有人可以证明吗? (最好的例子)

5
将参数作为const传递时是否过早优化?
“过早的优化是万恶之源” 我认为我们都可以同意。我尽力避免这样做。 但是最近我一直想知道通过const Reference而不是Value传递参数的做法。我已经被教导/了解到,非平凡的函数参数(即大多数非原始类型)最好通过const引用传递-我读过的很多书都将其推荐为“最佳实践”。 我仍然不禁感到奇怪:现代的编译器和新的语言功能可以解决奇迹,因此我所学的知识可能已经过时了,而且如果两者之间存在任何性能差异,我实际上也不会费心去剖析。 void fooByValue(SomeDataStruct data); 和 void fooByReference(const SomeDataStruct& data); 我所学的做法是-传递const引用(对于非平凡类型默认为)-过早优化吗?

10
在开发的开始或结束时,什么时候更好地优化软件以获得更好的性能?
我是一名初级软件开发人员,我想知道什么时候是优化软件以提高性能(速度)的最佳时机。 假设该软件不是非常庞大且难以管理,是花更多的时间在开始对其进行优化上还是我应该只是开发能够正确执行所有功能的软件,然后继续对其进行优化以获得更好的性能?

11
C ++编译器会删除/优化无用的括号吗?
请问代码 int a = ((1 + 2) + 3); // Easy to read 运行慢于 int a = 1 + 2 + 3; // (Barely) Not quite so easy to read 还是现代的编译器足够聪明,可以删除/优化“无用的”括号。 看起来似乎很少有优化方面的问题,但是选择C ++而不是C#/ Java / ...都是关于优化(IMHO)的。

6
C ++中的内联函数。重点是什么?
根据我所读的内容,编译器没有义务用其主体替换内联函数的函数调用,但是如果可以的话,它将这样做。这让我开始思考-如果是这种情况,为什么我们要使用内联词?为什么不将所有函数默认设置为内联函数,并让编译器确定它是否可以用函数主体替代调用?

18
您要优化什么?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 6年前关闭。 一般来说,在设计软件时,您通常倾向于哪种类型的优化? 您是喜欢优化设计的人吗? 开发时间(即快速编写和/或易于维护)? 处理时间 存储空间(RAM,DB,光盘等) 当然,这很大程度上取决于要解决的问题的类型以及所涉及的期限,因此,我想听听导致您选择一种优化形式而不是另一种优化形式的原因。

3
如何在不使用递归的情况下遍历树?
我的内存节点树很大,需要遍历该树。将每个子节点的返回值传递到其父节点。必须这样做,直到所有节点的数据都泡到根节点为止。 遍历是这样的。 private Data Execute(Node pNode) { Data[] values = new Data[pNode.Children.Count]; for(int i=0; i < pNode.Children.Count; i++) { values[i] = Execute(pNode.Children[i]); // recursive } return pNode.Process(values); } public void Start(Node pRoot) { Data result = Execute(pRoot); } 这工作正常,但我担心调用堆栈会限制节点树的大小。 如何重写代码,以便不进行递归调用Execute?
19 c#  optimization  trees 

3
当您无法重现环境时,如何进行测试和优化?
过去,我曾在多种环境中工作过。桌面应用程序,游戏,嵌入式内容,Web服务,命令行作业,网站,数据库报告等。所有这些环境都具有相同的特征:无论它们的复杂性如何,无论它们的大小如何,我都可以始终在我的机器上或开发环境中对应用程序的子集或分片进行测试。 今天我没有。今天,我发现自己处于主要关注可伸缩性的环境中。复制环境的成本过高。截取一部分环境,虽然很合理(某些部分需要模拟,或者不能在单实例模式下使用),但由于破坏了并发性和负载真正的系统遇到。即使是小的“测试”系统也有其缺陷。当您有2个节点和64个节点时,事情的表现会有所不同。 我通常的优化方法(度量,尝试某些操作,验证正确性,度量差异,重复)在这里不起作用,因为我无法有效地对问题的各个部分(并发鲁棒性和性能降低)进行第2步和第3步加载)。这种情况似乎并不独特。在这种环境下执行此类任务的常用方法是什么? 有一些相关的问题: 这个问题与硬件(如频谱分析仪)不可用有关,可以(相对)轻松地进行仿真。 这个问题是关于追踪仅存在于生产环境中的错误,这很有帮助-但是是另一种活动。

4
现实生活中的NP完整或NP难题
在现实生活中,是否有人在工作中定期解决NP完全问题或NP困难问题(通过试探法或追求次优解决方案等)?我知道它们会发生在调度,计划,VLSI设计等中,但是我试图了解当今经常使用程序员或工程师的主要行业。如果要开发专门知识或库,例如组合优化,在哪里可以将其用作编程工作的一部分? 有个人账户吗?

2
快速标签搜索算法
问题如下。 有一组简单实体E,每个实体都有一组附加的标签T。每个实体可以具有任意数量的标签。实体总数接近1亿,标签总数约为5000。 因此,初始数据如下所示: E1 - T1, T2, T3, ... Tn E2 - T1, T5, T100, ... Tk .. Ez - T10, T12, ... Tl 初始数据很少更新。 我的应用以某种方式在标签上生成逻辑表达式,如下所示: T1&T2&T3 | (T5&!T6) 我需要计算与给定表达式匹配的实体数量(注意-不是实体,而是数量)。当然,这可能并不完全准确。 我现在得到的是一个简单的内存中表查找,使我在单个线程上有5-10秒的执行时间。 我很好奇,有什么有效的方法来处理这些东西吗?您会推荐哪种方法?有一些通用的算法或数据结构吗? 更新资料 根据要求进行一些澄清。 T对象实际上是较短的常量字符串。但这实际上并不重要-我们总是可以分配一些ID并对整数进行运算。 我们绝对可以对它们进行排序。

4
应用程序能否在很大程度上影响功耗?
单个通用应用程序可以做些什么来影响其运行设备的功耗吗? 我不熟悉对单个应用程序进行的优化如何以一般方式影响功耗,有人可以解释一下编写应用程序的不同方法是否会影响所运行设备的功耗? 也就是说,可以以不同的方式编写的功能上完全相同的单一程序是否会在总体上极大地影响设备的功耗,而与不同的无关程序可能如何影响设备的功耗无关。

6
内存对齐有多重要?仍然重要吗?
从现在开始,我已经搜索并阅读了很多有关内存对齐方式,其工作方式和使用方法的内容。我现在找到的最相关的文章是这篇。 但是即使如此,我仍然对此有一些疑问: 在嵌入式系统之外,我们经常在计算机中拥有大量内存,这使内存管理的批评家减少了很多。我完全致力于优化,但是现在,如果我们将相同的程序与或进行比较,是否真的可以有所作为?没有它的内存重新排列和对齐? 内存对齐还有其他优势吗?我在某处读到CPU可以更好地/更快地使用对齐的内存,因为这样可以减少处理的指令(如果你们中的某个人有一篇文章/基准的链接?),在那种情况下,区别真的很重要吗?有没有比这两个更多的优势? 在第5章的文章链接中,作者说: 当心:在C ++中,看起来像结构的类可能会违反此规则!(它们是否取决于基类和虚拟成员函数的实现方式,并随编译器的不同而不同。) 本文主要讨论结构,但是局部变量声明是否也受此需求影响? 您是否知道内存对齐在C ++中如何工作,因为它似乎有些差异? 前一个问题包含“对齐”一词,但未提供上述问题的任何答案。

5
用于存储数以千万计的对象以进行查询的高效方法,每秒可以插入大量插入?
这基本上是一个日志记录/计数应用程序,它在p2p聊天网络上统计数据包的数量并统计数据包的类型等。这相当于在5分钟内大约有4-6百万个数据包。并且因为我仅对此信息进行“快照”,所以我仅每5分钟删除5分钟之前的数据包。因此,此收藏集中的物品数量上限约为10到1200万。 因为我需要与不同的超级对等方建立300条连接,所以每个数据包都可能尝试插入至少300次(这可能就是为什么将此数据保存在内存中是唯一合理的选择)的可能。 目前,我一直在使用字典来存储此信息。但是由于我要存储的项目太多,所以我遇到了大对象堆的问题,并且随着时间的推移,内存使用量不断增长。 Dictionary<ulong, Packet> public class Packet { public ushort RequesterPort; public bool IsSearch; public string SearchText; public bool Flagged; public byte PacketType; public DateTime TimeStamp; } 我尝试使用mysql,但是它无法跟上我需要插入的数据量(在检查以确保它不是重复的时候),而那是在使用事务时。 我尝试了mongodb,但是该CPU的使用非常疯狂,并且没有保持任何状态。 我的主要问题是每5分钟出现一次,因为我会删除所有早于5分钟的数据包,并对该数据进行“快照”。当我使用LINQ查询来计算包含某种数据包类型的数据包的数量时。我还对数据调用了一个distinct()查询,在该查询中,我从键值对的键中剥离了4个字节(IP地址),并将其与键值对的值中的requestingport值组合在一起,并使用该值来获得不同数量的所有数据包的对等体。 该应用程序当前的内存使用量徘徊在1.1GB左右,并且在调用快照时,它甚至可以使使用量翻倍。 现在,如果我有大量的ram,这将不是问题,但是目前运行此虚拟机的vm仅限于2GB的ram。 有什么简单的解决方案吗?

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.