问题标签 [memory-efficient]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1415 浏览

java - 二叉搜索树与 MultiMap

我必须解决的问题是我必须在树中输入 IP 地址前缀和与它们关联的数据,以便以后可以查询它们。我正在从一个文件中读取这些地址,该文件可能包含多达 1600 万条记录,并且该文件可能有重复项,我也必须存储这些记录。

我编写了自己的二叉搜索树,但了解到TreeMapJava 中的 a 是使用红黑树实现的,但 aTreeMap不能包含重复项。

我希望查询需要O(logn)时间。
数据结构需要在 Ram 中,所以我也不确定如何存储 1600 万个节点。

我想问:使用像番石榴这样的库在多地图中插入 Ips 会不会对性能造成太大影响?还是有更好的方法来做到这一点?

0 投票
2 回答
1670 浏览

python - 中断与布尔?

我的编程基础老师在她的一堂课上说过,使用“break”或“continue”关键字的效率低于使用布尔值退出循环的效率。

我编写并运行了一个用 Python 编写的程序,看看是否是这种情况:

在运行了 3 次并对结果进行平均后,我发现 breakTest 快了 6.25 秒。

那么 break 关键字更有效还是我的代码错误?

0 投票
3 回答
628 浏览

javascript - 在 Javascript 中设置函数的最佳方法(可能通过闭包?)

我有一个 Web 应用程序,它调用一个 Web 服务,该服务返回一些表示对象数组的 JSON。每个对象都有一些字段。下面是一些示例 JSON 来给出一个想法:

一旦返回,我使用 jQuery 的 parseJSON() 方法将其膨胀为对象数组(保留“数据”值)。这一切都很好,但是在我拥有我的数组之后,我有几个可以在每个数组插槽上运行的函数。例如,假设有一个名为 GetDuration() 的函数将打印出 end_time 和 start_time 之间的时间间隔。无论如何,我定义了几个函数(可能是 15 个),此时,我只需遍历整个数组并使用函数的副本对每个对象进行膨胀。例子

我认为这可以提高效率。现在,我认为每个数组项都有一个相同函数的单独副本,这不是必需的。我还注意到处理时间的滞后,我希望可以减少。我读过关于 javascript 闭包的文章,在这种情况下它们似乎可以帮助我,但我没有太多在闭包中编写函数的经验。我会设置闭包然后修改 JSON 以某种方式膨胀到闭包类型的对象吗?或者我会像我今天所做的那样膨胀到常规的 javascript 对象,然后以某种方式通过并更改对象类型以指向我创建的闭包?

任何想法或建议将不胜感激。

谢谢...

-本

0 投票
1 回答
2340 浏览

android - 如何在 Android 中有效地绘制放大的像素艺术?

我正在制作一款包含大量像素艺术的游戏。我的游戏中的标准按钮约为 12x12 像素,并按比例放大了五倍以进行显示。根据屏幕的不同,所有字符也都放大了两倍。问题是,如果我将所有这些图像存储到放大的位图,我会在 Android 中遇到内存不足错误。如果我每次都尝试按比例放大它们进行绘图,那么游戏运行速度非常慢。

这就是我编写自己的 PixelArtBitmap 类的原因。它可以生成出色的图像并且只需要很少的内存,但是效率非常低,大大降低了我的 fps。它仍然比每次绘制位图都要快。这是课程:

那么,我怎样才能让这门课更快,或者有没有完全不同的方法可以正确地做到这一点?

0 投票
2 回答
641 浏览

c++ - 2bit 位域数组对性能和缓存效率的影响?

我需要一个 2 位数组,我根本不关心节省内存,但我关心的是尽量减少缓存未命中和最大限度地提高缓存效率。使用 bool 数组将使用 4 倍的内存,这意味着对于缓存中每个可用的数据块,将有 3 个未使用。所以从技术上讲,如果我使用位域,我可以获得 3 倍更好的缓存一致性。

计划是将其实现为一个字节数组,分为 4 个相等的位域,并使用 div 函数能够获得整数商和余数,可能在单个时钟内,并使用它们访问正确的索引和右位域。

我需要的数组大约有 10000 个元素长,因此它将产生更密集的打包数据,使用 2 个实际位将允许整个数组适合 L1 缓存,而使用字节数组这是不可能的。

所以我的问题是,是否有人可以告诉我这在面向性能的任务中是否是一个好主意,所以我知道是否值得继续实施 2 位数组?当然,最好的了解方法是分析,但提前提供的任何信息都可能有用,我们将不胜感激。

0 投票
1 回答
330 浏览

matlab - 如何在数组中将一行的一部分与另一行交换?

我正在编写一个简单的遗传算法(GA)。可能有无数地方我不必要地使用了for循环。我想要一些关于如何提高 MATLAB 效率的提示以及我的问题的答案。据我所知,我已经成功了,但我不确定。这段代码定义的区域是单点交叉

这是我尝试过的...

  • 其中,“crossPoints”是两个二进制编码染色体之间需要单点交叉的点。
  • 'popSize' 是人口的大小,我的代码要求为偶数
  • 'isolate' 定义了需要相互交换的 2 行的部分
  • 'chromoParent' 是需要通过单点交叉改变的初始种群
  • 'chromoChild' 是结果人口
  • 'chromoParent' 和 'chromoChild' 都由一个大小为 popSize x 25 二进制字符的数组表示

你能在我思考这个问题的方式中发现一个错误吗?什么是最有效的方式(在计算时间)来实现同样的事情?如果您可以尽可能广泛,这将有所帮助,以便我可以开始将我在这里学到的原则应用到我的其余代码中。

谢谢你。

0 投票
3 回答
174 浏览

java - Java 使用 volatile 关键字内存效率高吗?

如果使用 1 个易失性变量,它是否也会关闭其他相关非易失性变量的 cpu 缓存?

0 投票
2 回答
2027 浏览

performance - 从大文件访问 n-gram 频率

我对自然语言处理和 Java 编程很陌生。我有一个非常大的文本文件,其中包含 ngram 和相关频率(aaprox. 250 mb)。我需要在程序运行时获取频率值,给定一个 ngram。文件中提供的 ngram 频率如下(仅作为示例):

我尝试在启动时通过填充一个哈希集来读取文件……但一个 18mb 的文件花了将近 1500 毫秒(使用 System.currentTimeMillis() 测试)。现在我正在考虑对 n-gram 计数进行排序并将 250mb 文件分成小块并填充一个列表并通过在单独的索引中索引文件集并引用它来按需获取频率。

但是,我不确定是否有另一种更简单或更有效的方法来做到这一点。请让我知道是否有更好的方法来做到这一点。(最好不使用任何脚本或库......)。谢谢你们。

0 投票
5 回答
1683 浏览

memory - 哪种编程语言更适合实现基于搜索的问题求解器?

我目前正在开始为人工智能课程做最后的项目(作为我的计算机科学学士学位的一部分)。在这个项目中,我们需要在人工智能领域选择一个有趣的问题,扩展课堂上的一个或多个主题,并解决它。我们稍后会写一份报告来讨论我们的结果并提交报告和我们编写的代码。

显然,我们不希望在经典问题的研究中达到最先进的水平,而是要么检查并解决(在很大程度上)一个不常见的问题(大多数选择这种方法的人选择解决一些简单的计算机,要么AI 研究社区尚未彻底解决的棋盘游戏)或以某种新颖的方式检查更常见的问题,可能提出一种新的有趣的启发式或对现有算法的一些修改。在后一种情况下,我们预计不会超越现代研究结果,只是提供一些新的视角。

我和我的伙伴为该项目选择的主题是推箱子,这使我们处于第二组(它没有被研究死,因为只有三分之二的常见测试集可以由最好的求解器解决,但状态这个问题的最先进的解决方案似乎太复杂了,我们希望通过一个为期两周的兼职项目来接近他们)。我们想尝试使用搜索问题方法解决推箱子问题。

无论如何,在开始实现我们的推箱子求解器之前,我开始想知道我们熟悉的几种语言(C、C++、Java 和 Python)中的哪一种更适合用于实现基于搜索的求解器来执行在一个非常大的搜索空间上搜索(推箱子有一个非常深的搜索树,有些问题需要超过 300 步才能解决,并且分支因子非常高[在某些问题中超过 100];请注意,这个高分支因子是在以下情况下实现的只考虑石头\盒子移动,不考虑玩家移动,因此在每种状态下,我们可以将任何石头移动到四个方向中的任何一个)。

我开始考虑这个问题的主要原因是因为在另一门关于人工智能的课程中——处理将人工智能技术应用于产品设计——我创建了一个自动化房间设计师,它将通过搜索所有可能的房间设计的状态空间来设计一个房间(具有给定的房间大小和一套家具)并返回得分最高的状态(通过一些启发式方法测量)。该程序是用 Java 编写的,每次运行时都会耗尽内存,只搜索了数万个搜索节点。我认为发生这种情况的主要原因是因为我为那个项目选择了一种非常面向对象的方法;它是用 Java 编写的,每个搜索状态都由一个对象表示,每个这样的状态,当由一个搜索器对象到达时,

现在,我知道问题的一部分是使用内存密集型算法 (A*),以及我选择实现它的方式,但我想知道使用 Java 是否也存在问题。所以这让我想到了两个问题:
1. 一般来说,在实现搜索问题和搜索算法时,哪种编程方法更合适?(面向对象、函数式或其他)
2. 在实现搜索问题和搜索算法时,哪种编程语言更合适,Java、C、C++ 还是 Python?(其他语言也是可能的,但前提是它们的语法与上述语言之一非常相似)

具体来说,这些语言的哪些特性和特性可用于实现一个问题解决程序,该程序旨在以内存(和运行时)有效的方式在非常大的搜索空间上进行搜索?

0 投票
2 回答
221 浏览

c++ - 为什么 C 在没有指针的情况下没有按地址/引用传递?

考虑使用指针传递的 C++ 中这个交换函数的简单测试。

这个程序是否比我按地址传递时使用更多的内存?比如在这个函数 decleration 中:

通过不需要创建指针变量,这个 C++ 函数的按引用传递版本是否使用更少的内存?

并且 C 不具有与 C++ 相同的“按引用传递”能力吗?如果是这样,那为什么不呢,因为这意味着内存效率更高的代码,对吧?如果不是,那么 C 不采用这种能力的原因是什么。我想我没有考虑的是 C++ 可能会创建指针以在幕后实现此功能。这就是编译器实际上所做的——所以除了更简洁的代码之外,C++ 真的没有任何真正的优势吗?