小编ssh*_*shh的帖子

编译器优化的功能代码比命令式代码执行得更好的示例

无副作用,引用透明的函数编程的承诺之一是可以广泛优化这样的代码.引用维基百科:

在许多情况下,数据的不可变性可以通过允许编译器在命令式语言中做出不安全的假设来提高执行效率,从而增加强调文本在线扩展的机会.

我想看一些示例,其中函数式语言编译器通过生成更好的优化代码来优于命令式编译器.

编辑:我试图给出一个特定的场景,但显然这不是一个好主意.所以我会尝试以不同的方式解释它.

程序员将想法(算法)翻译成机器可以理解的语言.同时,翻译的一个最重要的方面是人类也可以理解产生的代码.不幸的是,在许多情况下需要权衡:简洁易读的代码会受到性能降低的影响,需要手动优化.这容易出错,耗时,并且使代码的可读性降低(完全不可读).

函数式语言的基础,例如不变性和引用透明性,允许编译器执行广泛的优化,这可以取代手动优化代码和免费程序员进行权衡.我正在寻找想法(算法)及其实现的示例,例如:

  1. (功能)实现接近最初的想法,很容易理解,
  2. 它由语言的编译器进行了广泛的优化,并且
  3. 在命令式语言中编写类似的高效代码很难(或不可能),而无需手动优化,降低其简洁性和可读性.

如果它有点模糊,我道歉,但我希望这个想法很明确.我不想对答案给予不必要的限制.如果有人知道如何更好地表达它,我愿意接受建议.

我的兴趣不仅仅是理论上的.我想使用这些例子(以及其他内容)来激发学生对函数式编程感兴趣.

起初,我对评论中提出的一些例子并不满意.我想再次反对,这些都是很好的例子.请随意将它们扩展为完整的答案,以便人们可以评论并投票给他们.


(一类这样的例子很可能是并行化代码,它可以利用多个CPU内核.通常在函数式语言中,这可以轻松完成而不会牺牲代码的简单性(比如在Haskell中添加parpseq在适当的位置).我是对这些例子感兴趣,但也对其他非平行的例子感兴趣.)

optimization performance haskell functional-programming imperative-programming

29
推荐指数
2
解决办法
1770
查看次数

Jest中'toBe'和'toEqual'有什么区别?

Jest文档内容如下:

toBe只是检查一个值是你所期望的.它使用===来检查严格的相等性.

并为toEqual:

如果要检查两个对象是否具有相同的值,请使用.toEqual.这个匹配器递归地检查所有字段的相等性,而不是检查对象标识 - 这也称为"深度相等".例如,toEqual和toBe在此测试套件中的行为不同,因此所有测试都通过.

    const x = { a: { b: 3 } };
    const y = { a: { b: 3 } };

    expect(x).toEqual(y);
    expect(x).toBe(y);
Run Code Online (Sandbox Code Playgroud)

在这种情况下,toEqual通过但toBe失败.我明白这是toEqual通过,因为它做了一个非常平等的检查.为什么toBe在这种情况下失败?

此外,是否有使用toBetoEqual(不仅仅是在Jest中,而且在其他测试框架中)的最佳实践?

testing jestjs

27
推荐指数
5
解决办法
1万
查看次数

关于node.js内部异步I/O机制的困惑

  1. 我已经了解到node.js在内部使用libeio来执行异步文件 I/O,使用线程池,在*nix平台上,我是对的吗?
  2. 那么异步网络 I/O呢?它是由libev完成的吗?还有线程池吗?
  3. 如果内部有线程池,那么它如何比传统的每线程请求模型更高效?每个I/O请求是一个线程吗?
  4. Windows上的机制是什么?我知道它是由IOCP完成的,并且有一个内核级线程池,对吧?
  5. 为什么linux没有像Windows IOCP这样的本机完全AIO机制呢?它将来会有吗?

根据昌昌的回答更新:

  1. 我快速查看了@changchang给出的源代码,发现默认的线程池大小可以通过UV_THREADPOOL_SIZE重置,我想知道在哪种情况下会使用这个?
  2. 我还发现getaddrinfo使用这个线程池,除了fs还有更多吗?如果所有同步作业都将在此线程池中完成,那么默认大小"4"是否足够?
  3. 正如我现在的理解,node.js进程中将有6个基本线程:1个V8线程(事件循环,用户javascript代码运行),1个libuv事件循环,4个线程池,我是对的吗?
  4. 我怎样才能在shell(Ubuntu)中看到这些线程?我用ps -eLf | grep节点| grep -v grep只看到两个:

    root 16148 7492 16148 0 2 20:43 pts/26 00:00:00 ./bin/node /home/aaron/workspace/test.js
    root 16148 7492 16149 0 2 20:43 pts/26 00:00:00./bin/node /home/aaron/workspace/test.js

javascript linux io node.js libuv

23
推荐指数
1
解决办法
6509
查看次数

如何在雨果私密发帖?

我正在寻找方法让我的博客上的一些帖子只对我自己可见,但在Hugo看来似乎不是这样.

有没有办法解决这个问题,比如为某些帖子设置密码?
或者支持该功能但我还没有找到它?

blogs hugo

6
推荐指数
1
解决办法
1273
查看次数

为什么 Chrome 的隐身模式比正常模式更快地检索资源?

我在多台机器(台式机和笔记本电脑)和操作系统(Windows 和 Mac)上对此进行了测试,我可以复制相同的行为:
在隐身模式下下载资源的速度要快得多(而不是渲染速度)

我可以粗略地想到两种情况,在两种情况下,隐身模式和普通模式分别可以更快:

  • 隐身模式可以更快,因为它没有扩展。
  • 普通模式可以更快,因为它缓存资源。

因此,我在正常模式下禁用了所有扩展程序,并“重置”了删除缓存和浏览历史记录等的所有设置。

在所有情况下,当我查看 Chrome 检查器时,隐身模式下的资源下载速度比正常模式下快得多。链接在隐身模式下加载速度极快。

为什么会出现这种情况?

browser performance google-chrome

6
推荐指数
1
解决办法
4933
查看次数