相关疑难解决方法(0)

Erlang如何在同一节点上的进程之间传递消息?

在节点之间,消息(必须)通过TCP/IP传递.但是,它们在同一节点上运行的进程之间传递了什么机制?在这种情况下是否也使用TCP/IP?Unix域套接字?"节点内"和"节点间"消息传递之间的性能差异是什么?

erlang message-passing

10
推荐指数
2
解决办法
1790
查看次数

为什么Elixir消息传递时间与消息大小成正比?

我发现在Elixir中传递消息所花费的时间与消息的大小成正比,而我预计它会相对恒定.由于数据结构是不可变的,因此运行时应该能够通过引用(在恒定时间内)在进程之间传递大型结构.考虑以下测试.

use Bitwise

defmodule PerfTask do
  def pack(s) do
    {millis, packed} = :timer.tc(fn -> Enum.to_list(s) end)
    IO.puts("packed in #{millis} millis")
    Task.async(fn -> packed end)    
  end

  def unpack(t) do
    {millis, unpacked} = :timer.tc(fn -> Task.await(t) end)
    IO.puts("unpacked in #{millis} millis")
    unpacked
  end

  def go(n) do
    IO.puts "n = #{n}"
    1..n |> pack |> unpack
  end
end

PerfTask.go(1 <<< 20)
Run Code Online (Sandbox Code Playgroud)

在列表中有2 ^ 20个元素,打印出来

n = 1048576
packed in 106481 millis
unpacked in 9916 millis
Run Code Online (Sandbox Code Playgroud)

构建列表需要大约10倍的时间才能将其排除在外Task.(请注意,列表是在任务启动之前构建的.所有任务都要返回已经构建的列表.)

在列表中有2 ^ 22个元素,它会打印出来

n = …
Run Code Online (Sandbox Code Playgroud)

performance elixir

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

如何在Elixir/Erlang中通过指针相等来比较两个结构

(在Elixir中给出的例子.)

假设我有以下代码,

x = {1, 2}
a1 = {"a", {1, 2}}
a2 = {"a", {1, 2}}
a3 = {"a", x}
Run Code Online (Sandbox Code Playgroud)

据我所知,{1, 2}在不同的内存位置创建了三个元组.

使用运算符=====比较任何a变量总是返回true.这是可以预料的,因为这两个运算符仅在比较数字类型时有所不同(即,与之1 == 1.0不同1 === 1.0).

所以,然后我尝试通过模式匹配比较结构,使用以下模块(严格创建以测试我的情况),

defmodule Test do
  def same?({x, y}, {x, y}), do: true
  def same?(_, _), do: false
end
Run Code Online (Sandbox Code Playgroud)

但是召唤Test.same?(a1, a3)也会回来true.

如何使用指针相等性比较两个结构,以便我可以确定它们在内存中是否是相同的结构?

谢谢

erlang elixir

5
推荐指数
3
解决办法
357
查看次数

标签 统计

elixir ×2

erlang ×2

message-passing ×1

performance ×1