- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在 Intellij Idea 中运行一些 CPU 密集型 Clojure 代码(我认为这并不重要 - 它似乎只是产生一个进程)。根据 htop 和 top 的说法,它在我的笔记本电脑上使用了所有 4 个内核(好吧,2 个 + 超线程)。尽管我在代码中没有任何明确的并行性。
更详细一点:top 显示了一个 CPU 使用率约为 380% 的单个进程,而 htop 显示了一个“父”进程,然后是 4 个“子”进程,每个进程占用 1/4 的时间和约 100% 的 CPU。
这是正常的吗?或者这是否意味着我在某个地方出了点问题?该代码涉及许多惰性序列,但其核心修改了可变数据结构(可变的 - 不是 Clojure 数据结构 - 累积结果的哈希)。 我没有使用任何明确的并行性。
在 JCA/JCE(加密库)中可能花费了大量时间(我没有分析过)——我在 CTR 模式下使用多个 AES 密码,每个密码作为安全随机字节流( code here ),实现为懒惰的序列。也许这是并行化的?
更随意的想法:这可能与IO有关吗?我在加密的 SSD 上运行,该程序正在处理来自磁盘的数据,因此需要大量读取。但是 htop 将系统时间显示为红色,而这些是绿色的。
抱歉问了这么模糊的问题。如果需要,我可以发布更多信息。这是 64 位 Linux (JDK 1.7.0_05) 上的 Clojure 1.4。正在执行的代码是 here但它非常困惑(更抱歉)并且分布在各种文件中(大部分 CPU 时间都花在了 nearest-in-dump
的代码中)。注意 - 请不要浪费时间尝试运行代码来重现,因为它期望预先存在的数据转储在磁盘上(不在 git 中)。
调试器 在调试器中运行(谢谢,A-M)显示四个线程(如果我正确理解调试器),但只有一个正在执行程序。它们被标记为终结器、main(程序)、引用处理程序和信号调度程序。 Finalizer + ref handler 处于等待状态;信号调度程序没有可用的帧。我暂时认为这意味着并行性处于较低级别,也许在加密实现中?
啊哈我认为它是并行 GC(Java 现在有一个并发收集器)。一开始,当实际进程暂停时,CPU 使用率会上升(它打印出一个常规的滴答声)。并且由于它正在处理大量数据,因此它生成了大量短期对象(通过使用 -XX:+UseSerialGC 确认,这将 CPU 使用率降低到 100%)
最佳答案
好吧,我觉得发布这个有点愚蠢,因为它现在看起来很明显,但它似乎是并行 GC。我正在处理大量数据(从 SSD 中提取)并生成大量短期对象。看来 JVM 具有并行 GC。见 http://blog.ragozin.info/2011/12/garbage-collection-in-hotspot-jvm.html
这也可能是问题的征兆 - What is going on with java GC? PermGen space is filling up? - 我明天将调查(我没有提到它 - 虽然回想起来我应该有 - 但这是内存不足的临界点)。
更新 :使用 -XX:+UseSerialGC 运行将 CPU 总使用率降低到 100%(即 1 个核心)。但我并不是说上面的两个解释是排他性的,只是通过更好的配置和/或代码我可以减少 GC 的数量。
关于clojure - Clojure(或 JCE,或 JVM,或...?)会自动引入并行性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11371541/
为什么该语言的名称是“Clojure”? 我用谷歌搜索了一下,在#clojure 中询问。到目前为止,还没有运气。 最佳答案 Rich Hickey(他是 Clojure 的设计者)对此的评论是 wi
我不明白为什么升级后会出现以下编译错误: Compiling addr-verify.core Exception in thread "main" java.lang.NoClassDefFound
我试图将从映射操作返回的(惰性)序列传递给另一个映射操作,以便我可以在第一个序列中查找元素。代码从文本文件(以行/列格式)解析一些足球装置,清理它,然后返回一张 map 。 这是代码: (ns fix
我想过滤一组,例如: (filter-set even? #{1 2 3 4 5}) ; => #{2 4} 如果我使用clojure.core/filter我得到一个不是集合的seq: (filte
(defn hi[](+ 5 6)) (hi) (defn hi[](+ 6 7)) (hi) 你好,我是 clojure 的新手。如上所述,我编写了两个具有相同名称的函数。我们可以在 cloj
我按照这个伪代码递归地将十进制转换为二进制。 findBinary(decimal) if (decimal == 0) binary = 0 else binar
我正在尝试学习 Clojure 并尝试定义这个简单的函数: user=> (defn triple [arg] (* 3 arg)) #'user/triple user=> (triple 1) 3
是->和 ->>宏只是为了使代码更具可读性还是它们还有其他特定功能? 最佳答案 线程优先( -> )和线程最后( ->> )是为了使代码更具可读性。但这已经很重要了! 它允许取消嵌套函数调用(示例取自
我在 http://www.learningclojure.com/2010/11/yet-another-way-to-write-factorial.html 上找到了这个代码,但我不明白 pop
我正在阅读 Programming Clojure 2nd edition,在第 49 页它涵盖了 Clojure 的 for 循环结构,它说它实际上是一个序列理解。 作者建议使用以下代码: (def
Clojure 中有双端队列吗?我的印象是 Clojure 的 PersistentQueue 是单端的(我错了吗?)。我需要能够从队列的任一端删除(即“pop”)和“peek”数据。我所说的双端队列
换句话说,有没有办法在看起来不像 (MACRO arg* ...) 的表单上触发宏扩展? . 举一个假设的例子: (defmacro my-var (do (printf "Using my-va
我很难理解懒惰。 有人能帮我理解为什么我下面的函数不是懒惰的吗 (defn my-red ([f coll] (my-red f (first coll) (rest coll) ))
在 Clojure 核心中决定参数函数顺序的规则是什么(如果有的话)? 类似 map 的函数和 filter期望数据结构作为最后一个 争论。 类似 assoc 的函数和 select-keys期待数据
我在 clojuredocs 上遇到过 completing 函数,但目前没有文档。 你能提供一些例子吗? 最佳答案 completing 用于扩充可能没有具有一元“完成”元数的一元重载的二元归约函数
这个现在支持吗?我能找到的唯一信息是来自维基的示例( https://github.com/clojure/core.match/wiki/Deftype-and-defrecord-matching
我正在关注“Clojure in Action”,对此我感到困惑: (defn with-log [function-to-call log-statement ] (fn [& args
对于下面的代码,箭头是宏还是函数名称中的简单字符? (来自 here) (defn file->map [file] ;; TODO ) 最佳答案 箭头是函数名称的一部分。有一个函数定义,不是
Clojure 的 range函数包含来自 start独家在end (如果提供)。核心库中是否有一个函数可以提供完全包含(开始和结束)的范围? 我发现在某些情况下必须调整最终值的代码 - 例如向下而不
当我尝试从 REPL 运行以下代码时(使用动态记录): (defrecord (symbol "rec2") (vec (map symbol ["f1" "f2"]))) 我收到错误 Compile
我是一名优秀的程序员,十分优秀!