小编huo*_*uon的帖子

独立运行多个线程中的Boehm GC

我正在尝试将一些绑定写入Boehm GC for Rust.

一些背景:Rust被设计为高并发语言,这种设计的结果是能够将GC指针静态地限制在分配它们的线程内(也就是说,在线程x中分配的GC指针可以永远不会被另一个线程保持活着(甚至完全被引用).

因此,我希望驾驶Boehm尽可能地利用它来获得性能:

  1. 线程安全,所以我可以从多个线程分配和收集
  2. 尽可能小的集合(即只是当前的线程),其他线程可以继续运行,因为它们不可能干扰与自己之外的GC指针相关的任何事情
  3. 优选地,完全线程本地,不同线程的GC"实例"之间没有同步

1很简单,但我找不到2和3的任何工具.最重要的部分是1和2因为我希望能够在后台运行线程,而不管其他线程在做什么(即使它们都是分配和垃圾收集千兆字节的内存).

(我确实知道THREAD_LOCAL_ALLOC&gc_thread_local.h,但是这并不完全满足3,它只是使它更有效,但它仍然有效传递线程之间本地线程分配的指针,而我不需要保证.)

c multithreading garbage-collection boehm-gc rust

36
推荐指数
1
解决办法
1980
查看次数

使用 Enum/Literal 键输入详尽字典的提示

我正在研究具有广泛类型提示的代码库,由 mypy 检查。在某些情况下,我们有一个从enum.Enum静态已知值或其他小型有限集 ( typing.Literal) 到固定值的映射,因此使用字典很方便:

# GOOD
from enum import Enum, auto

class Foo(Enum):
   X = auto()
   Y = auto()

lookup: dict[Foo, str] = {Foo.X: "cool", Foo.Y: "whatever"}

print(lookup[Foo.X])
Run Code Online (Sandbox Code Playgroud)

然而,这个字典不必是详尽的(又名全部):mypy 对于缺少键非常满意,并且缺少键的索引将在运行时失败。在实践中,对于大型枚举(在定义 时忘记成员dict),或者向现有枚举添加成员时(尤其是在lookup完全不同的文件时),很容易发生这种情况。

例如,这很好地通过了mypy --strict,但在运行时失败了,因为我们“忘记”更新lookup自身:

# BAD
from enum import Enum, auto

class Foo(Enum):
   X = auto()
   Y = auto()
   Z = auto() # NEW

lookup: dict[Foo, str] = {Foo.X: "cool", Foo.Y: "whatever"}
 
print(lookup[Foo.Z]) # CHANGED
Run Code Online (Sandbox Code Playgroud)

我希望能够将特定的字典/映射标记为全部/详尽,这意味着,例如,mypy …

python enums mypy python-typing typeddict

15
推荐指数
1
解决办法
6149
查看次数

缺少序列化器时,密封特征和对象枚举的快速JSON4s序列化失败

设定

我正在使用json4s 3.2.11和Scala 2.11。

我使用定义了一个枚举sealed trait,并为其使用了一个自定义序列化器:

import org.json4s.CustomSerializer
import org.json4s.JsonAST.JString
import org.json4s.DefaultFormats
import org.json4s.jackson.Serialization

sealed trait Foo
case object X extends Foo
case object Y extends Foo

object FooSerializer
    extends CustomSerializer[Foo](
      _ =>
        ({
          case JString("x") => X
          case JString("y") => Y
        }, {
          case X => JString("x")
          case Y => JString("y")
        })
    )
Run Code Online (Sandbox Code Playgroud)

这很棒,添加到以下格式后效果很好:

{
  implicit val formats = DefaultFormats + FooSerializer
  Serialization.write(X) // "x"
}
Run Code Online (Sandbox Code Playgroud)

这很棒!

问题

如果未将序列化程序添加到格式中,则json4s将使用反射来创建字段的默认表示形式,这对于这些object没有字段的s 极为不利。它无声地执行此操作,似乎无法控制它。

{
  implicit val formats = …
Run Code Online (Sandbox Code Playgroud)

reflection serialization scala json4s

9
推荐指数
1
解决办法
202
查看次数

当特征和类型都不在此包中时提供实现

我想为一个原始类型提供一个特征的实现ToHex(我没有定义serialize)u8:

impl ToHex for u8 {
    fn to_hex(&self) -> String {
        self.to_str_radix(16)
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我得到这个编译错误:

error: cannot provide an extension implementation where both trait and type are not defined in this crate
Run Code Online (Sandbox Code Playgroud)

我理解这个错误的原因及其逻辑,这是因为特征和原始类型都在我的代码外部.但是我该如何处理这种情况并提供ToHex实现u8呢?更一般地说,你如何处理这类问题,在我看来,这个问题必须是常见的,它应该是可能的,并且很容易扩展这样的类型?

traits rust

7
推荐指数
2
解决办法
2727
查看次数

优化ARM NEON中的水平布尔减少

我正在尝试使用跨平台SIMD库ala ecmascript_simd aka SIMD.js,其中一部分是提供一些"水平"SIMD操作.特别是,库提供的API包括any(<boolN x M>) -> boolall(<boolN x M>) -> bool函数,其中<T x K>是一个K类型元素的向量,T并且boolN是一个N比特布尔值,即全部为1或全部为零,因为SSE和NEON返回它们的比较操作.

例如,v设为<bool32 x 4>(一个128位向量),它可能是VCLT.S32某种结果.我想计算all(v) = v[0] && v[1] && v[2] && v[3]any(v) = v[0] || v[1] || v[2] || v[3].

使用SSE很容易,例如movmskps将提取每个元素的高位,因此all对于上面的类型变为(使用C intrinsics):

#include<xmmintrin.h>
int all(__m128 x) {
    return _mm_movemask_ps(x) == 8 + 4 + 2 + 1;
} …
Run Code Online (Sandbox Code Playgroud)

arm simd neon

7
推荐指数
1
解决办法
474
查看次数

Rust库开发工作流程

在Rust(+ Cargo)中开发库时,如何实现快速重新编译/测试循环?

开发应用程序时,很容易,我:

  • 在代码中进行更改

  • 切换到终端并运行 cargo run

  • 请参阅编译器反馈

但现在我想将我的应用程序的一部分作为库提取并在GitHub上发布.我想继续开发我的应用程序,但现在将此库作为依赖项.我将同时开发库和应用程序.

我现在如何获得相同的快速反馈?

库和应用程序都将在同一台机器上开发,我想对库进行更改,相应地更新应用程序并查看编译器反馈.

我猜我可以使用我的库作为Cargo.toml中的依赖项,cargo update每次我想更新我的应用程序的依赖项时运行,但这会有点慢,因为它必须每次都从github下载代码并重新编译所有依赖项.

workflow rust rust-cargo

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

低熵字母数字字符串的高效散列函数

我正在尝试编写一个(完美)哈希表来压缩从unicode代码点名称到其代码点编号的映射(将第二列映射到第一列).正如你可以看到有,可能的输入都非常有限,实际上有一个在字母恰好38个字符:AB...YZ,0...9,-和空间.此外,还有大量的(子)的重复,DIGIT ZERO,DIGIT ONE,... LATIN CAPITAL LETTER A,LATIN CAPITAL LETTER B等等.

通过选择种子来计算完美的哈希表S,然后尝试构造一个完美的哈希表种子(以某种方式)播种S.如果无法创建表,则会使用新种子重试.有很多冲突通常需要更多的重试,因为算法更难以使一切都适合.

这样做的结果是我的输入域具有低熵,并且表创建需要使用像DJB2这样的简单散列函数进行大量重试; 像FNV这样的更好的编组器可以很好地工作,但是像SipHash这样的更复杂和更慢的功能似乎平均需要更少的重试.

由于这是完全静态和预先计算的,我不太为质量而担心质量(即运行时任意输入的安全性和概率分布无关紧要),但更高质量的功能减少了给定级别所需的预计算时间相反,压缩,允许我在一些固定的时间内实现更高的压缩.

问题:是否有高效的已发布哈希函数调整为输入域限制,如下所示?也就是说,是否存在利用额外结构来执行更少操作但仍能实现合理输出的哈希函数?

我搜索过像'字母数字哈希函数'之类的东西,但结果是无关的(大多只是生成一个字母数字字符串作为哈希函数的输出); 甚至一些关于正确行话的指导,以便我可以搜索论文会有所帮助.

(这个问题的动机是稍微有点难以解决,而不是实际需要.)

hash alphanumeric

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

在Rust中更改树中的节点

我正在尝试编写一个函数,给定树结构,返回该树的副本,但在特定索引处更改节点.这是我到目前为止:

#[derive(Clone)]
pub enum Node {
    Value(u32),
    Branch(u32, Box<Node>, Box<Node>),
}

fn main() {
    let root = Node::Branch(1, Box::new(Node::Value(2)), Box::new(Node::Value(3)));
    zero_node(&root, 2);
}

pub fn zero_node (tree: &Node, node_index: u8) -> Node {

    let mut new_tree = tree.clone();

    fn zero_rec (node : &mut Node, node_count : u8, node_index : u8) -> u8 {
        if (node_index == node_count) {
            match node {
                &mut Node::Value(_) => { *node = Node::Value(0); },
                &mut Node::Branch(_, ref mut left, ref mut right) => { *node …
Run Code Online (Sandbox Code Playgroud)

rust borrow-checker

4
推荐指数
1
解决办法
1248
查看次数

将文本追加并添加到字符串中

我希望能够在字符串中搜索某个单词,并将字符追加并添加到该单词的每个实例中.

例:

I like cats, cats are awesome! I wish I had cats!
Run Code Online (Sandbox Code Playgroud)

变为:

I like (cats), (cats) are awesome! I wish I had (cats)!
Run Code Online (Sandbox Code Playgroud)

我知道我可以用

str_replace( 'cats', '(cats)', $string );
Run Code Online (Sandbox Code Playgroud)

但我必须两次写"猫".我想要一个只需要我写一次的方法.

php regex string

3
推荐指数
2
解决办法
3166
查看次数

平等的阶级误解

  • 我有自己的数据类型来表示图形的节点和边缘,如下所示:

    data Node a = Node a deriving (Show, Eq)
    
    data Label a = Label a deriving (Show)
    
    data Cost = CostI Int | CostF Float deriving (Show)
    
    data Edge label node = Edge (Label label, (Node node,Node node), Cost) deriving (Show)
    
    Run Code Online (Sandbox Code Playgroud)
  • 现在,我创建一个函数来检查边是否包含2个节点,如下所示:

    isEdge:: (Eq n) => (Edge l n) -> (Node n, Node n) -> Bool
    isEdge (Edge (_, (n1,n2), _)) (n3, n4) = result
         where result = (n1 == n3) && (n2 == n4)
    
    Run Code Online (Sandbox Code Playgroud)
  • 该函数运行良好,这里的问题是如果我从函数中删除(Eq n),它就会失败.那么,为什么这样,即使在上面的声明中我声明 …

haskell typeclass

3
推荐指数
2
解决办法
461
查看次数