小编Wan*_*eck的帖子

OCaml内部:例外

我很想知道如何在OCaml运行时处理异常以使它们如此轻量级.他们使用setjmp/longjmp还是在每个函数中返回一个特殊值,然后传播它?

在我看来,longjmp会给系统带来一点压力,但只有当引发异常时,检查每个函数的返回值才需要在调用函数后检查每个值和每个值,这在我看来会很多检查和跳跃,似乎表现最差.

通过查看OCaml如何与C接口(http://caml.inria.fr/pub/docs/manual-ocaml/manual032.html#toc142),并查看callback.h,似乎通过使用标记异常对象的内存对齐(#define Is_exception_result(v)(((v)&3)== 2)).这似乎表明它的实现不使用longjmp并在每次函数调用后检查每个函数结果.是吗?或者C函数已经尝试捕获任何异常,然后将其转换为这种格式?

谢谢!

compiler-construction ocaml exception internals longjmp

21
推荐指数
1
解决办法
1952
查看次数

磁盘性能持久(纯功能)红黑树

我正在研究实现一个简单的开源对象时态数据库的最佳数据结构,目前我非常喜欢使用持久性红黑树来实现它.

我使用持久数据结构的主要原因首先是最小化锁的使用,因此数据库可以尽可能并行.此外,实现ACID事务更容易,甚至能够抽象数据库以在某种集群上并行工作.这种方法的好处在于它几乎可以免费实现时态数据库.这是非常好的,特别适用于网络和数据分析(例如趋势).

所有这些都非常酷,但我对在磁盘上使用持久数据结构的整体性能有点怀疑.即使今天有一些非常快的磁盘可用,并且所有写入都可以异步完成,所以响应总是立竿见影,我不想在错误的前提下构建所有应用程序,只是意识到它并不是真的好这样做的方式.

这是我的思路: - 由于所有写入都是异步完成的,并且使用持久数据结构将不会使先前(当前有效)结构无效,因此写入时间实际上不是瓶颈.- 有一些关于此类结构的文献正是针对磁盘使用的.但在我看来,这些技术将增加更多的读取开销,以实现更快的写入.但我认为恰恰相反是可取的.这些技术中的许多确实最终会使用多版本树,但它们并不是严格不可变的,这对于证明持久开销非常重要. - 我知道在向数据库附加值时仍然需要进行某种锁定,而且如果不是要维护所有版本,我也知道应该有一个好的垃圾收集逻辑(否则文件大小肯定会大幅上升) .还可以考虑增量压缩系统. - 在所有搜索树结构中,我真的认为红黑是最接近我需要的,因为它们提供最少的旋转次数.

但是在此过程中存在一些可能的缺陷: - 异步写入 - 可能会影响需要实时数据的应用程序.但我不认为Web应用程序就是这种情况,大部分时间都是如此.此外,当需要实时数据时,可以设计另一种解决方案,例如需要以更实时的方式工作的特定数据的登记/结账系统. - 它们也可能导致一些提交冲突,但我没有想到它何时会发生的好例子.如果两个线程使用相同的数据,那么正常的RDBMS中也会发生冲突,对吧? - 拥有像这样的不可变接口的开销将呈指数级增长,一切都注定要很快失败,所以这一切都是个坏主意.

有什么想法吗?

谢谢!

编辑:似乎存在对持久性数据结构的误解:http: //en.wikipedia.org/wiki/Persistent_data_structure

database binary-tree functional-programming immutability data-structures

14
推荐指数
1
解决办法
2341
查看次数

System.Collections.Generic.Dictionary =终极表现?

我正在编写一个haXe C#目标,并且我一直在研究haXe的std库的性能差异,因此我们可以通过其跨平台代码提供最佳性能.

一个非常好的例子是哈希表代码.我有点不情愿使用.NET的字典,因为它看起来很笨重(键/值对的结构可能占用大量的内存,因为内存对齐问题,除了它所持有的不必要的信息),并且因为在std上库没有对象哈希这样的东西,我真的以为我可以通过不必调用GetHashCode来压缩一点性能,并一直内联它.

同样很明显,Dictionary实现使用链表来处理冲突,这远非理想.

所以我们开始实现我们自己的解决方案,从IntHash(Dictionary)开始我们首先实现了Hopscotch哈希,但它实际上并没有很好,但很明显它不支持非常好的哈希表,因为H通常是机器字,并且随着H /长度的增加,性能越差.

然后我们跳转到实现khash -inspired算法.这个具有很大的潜力,因为它的基准测试令人印象深刻,并且它处理同一阵列上的冲突.它也有一些很棒的东西,比如调整大小而不需要像我们那样需要两倍的内存.

基准令人失望.当然,没有必要说我们的实现中的内存使用量远低于Dictionary的内存使用率.但我希望也能获得不错的性能提升,但不幸的是,情况并非如此.它不是太低 - 不到一个数量级 - 但对于两个集合和获取,.NET的实现仍然表现更好.

所以我的问题是:这是我们对C#的最佳选择吗?我试着寻找任何自定义解决方案,似乎几乎没有.有C5通用集合,但代码是如此混乱,我甚至没有测试.我也找不到基准.

那么......是吗?我应该绕着Dictionary <>吗?

谢谢!!!

c# hash hashtable data-structures

9
推荐指数
2
解决办法
4780
查看次数

分代GC源代码

我正在研究GC实现,我正在寻找引用和良好的开源GC示例.

有没有好的和简单的代际GC实现?第二个最好的事情是良好的资源和指导方针!

谢谢!

c compiler-construction resources garbage-collection

9
推荐指数
2
解决办法
1068
查看次数

结构指针兼容性

假设我们有两个结构:

typedef struct Struct1
{
    short a_short;
    int id;
} Struct1;

typedef struct Struct2
{
    short a_short;
    int id;
    short another_short;
} Struct2;
Run Code Online (Sandbox Code Playgroud)

从哪里投Struct2 *来安全Struct1 *?ANSI规范对此有何规定?我知道有些编译器可以选择重新排序结构字段以优化内存使用,这可能会使两个结构不兼容.有没有办法确定这段代码是否有效,无论编译器标志如何?

谢谢!

c struct casting ansi

9
推荐指数
2
解决办法
1061
查看次数

内部类是轻量级的吗?

内部类比普通类更轻量级,还是最终java像普通类一样编译内部类?

我知道在java类不都是非常轻巧自己,他们占据了PermGen的内存的一部分,所以我想知道这是否是最好用的类似于闭包功能的内部类,或者如果标准类也做得很好?

java closures permgen inner-classes

8
推荐指数
2
解决办法
1955
查看次数

Delegates比类更轻量级吗?

我试过反汇编一个C#创建的可执行文件,但我无法得出结论.我想知道的是,如果对于CLR c#的委托是真正的特殊实体还是仅仅是编译器糖?

我问这个是因为我正在实现一种编译成C#的语言,而且将匿名函数编译为类而不是代理函数会更有趣.但是我不想使用后来我会后悔的设计,因为它们可能在内存上更重(我想起了Java的PermGen以我的问题为基础.尽管我知道CLR没有这样的东西).

谢谢!

- 编辑

为了更清楚一点,我想知道是否存在(和有什么)之间的区别:

void Main()
{
    Func<int, int, int> add = delegate(int a, int b) {return a + b;};
}
Run Code Online (Sandbox Code Playgroud)

并且,例如

class AnonFuncion__1219023 : Fun3
{
    public override int invoke(int a, int b)
    {
        return a + b;
    }
}
Run Code Online (Sandbox Code Playgroud)

- 编辑

我认为之间可能存在很大差异:

class Program
{
    static int add(int a, int b)
    {
        return a + b;
    }

    static void Main()
    {
        Func<int, int, int> add = Program.add;
    }
}
Run Code Online (Sandbox Code Playgroud)

class Function__432892 : Fun3
{ …
Run Code Online (Sandbox Code Playgroud)

c# clr il delegates internals

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

在ANSI C中实现无溢出的系统堆栈

我刚刚读到Google Go默认情况下如何使每个线程的堆栈大小减少,然后如果发生溢出则链接到新堆栈(参见此处的第16页).我想知道在C中做到这一点的最好方法.

我不得不说我不是C专家,所以可能有更好的方法来检测C上的Stack Overflow,但是我无知,这就是我认为我会实现它的方式:

我想到的第一件事是每次我们有一个新的堆栈,我们得到一个堆栈变量的地址,并且我们大致有起始堆栈地址.然后我们需要能够检索线程有多少堆栈空间.如果线程不是主线程,这是可能的,但我不知道如何在C上获取此信息.

然后我们需要通过检索当前堆栈变量地址来检查(每个函数调用,它可能是)已经使用了多少堆栈.如果我们检测到可能的堆栈溢出,我们需要有一些方法来创建一个新的堆栈并链接到最后一个堆栈.我认为可以在C中完成的唯一方法是创建一个新线程来执行我们想要的函数,并锁定当前线程直到函数返回其结果.

那么,是否有更清洁/更好的方法来实现这一点?

谢谢!

c stack-overflow go c89

8
推荐指数
1
解决办法
773
查看次数

最好的(scala和其他针对java vm的语言)优化

我刚刚阅读了关于scala实现泛型专业化的内容,它确实引起了我的注意,他们通过这个功能提高了速度.我想知道其他功能有哪些语言针对java vm实现,实际上使它们比java更好?我知道生成的代码越远离java,其性能就越低.所以我真的很想知道语言可以实现哪些其他功能来实现更好的java性能.

请不要回答这个问题,谈论scala在java之上的非常好的功能,我正在严格谈论性能.

如果您的建议仍未实施,请回答!

谢谢!

java optimization performance programming-languages scala

6
推荐指数
2
解决办法
587
查看次数

安全的跨平台功能,以获得规范化的路径

我希望有一个标准函数将相对路径转换为绝对路径,如果可能的话,我想尽可能使它成为跨平台(所以我想避免调用外部库函数).这样做是为了防止路径攻击.

我知道这样的函数无法检测符号链接,但我对我的应用程序没问题.

我可以滚动自己的代码,但可能存在一些问题,例如平台如何处理"../"模式的编码或变体.

是否有类似的东西已经实施?

c security normalization relative-path

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

C语言中最优质的抖动库

我正在开发一个与OpenGL一起使用的纹理图册打包器,我正在寻找一个开源(如果它是一个库,它会更好,但开源软件也会更好!)解决方案调色板创建/抖动的最佳结果.它确实不需要很快,但需要达到最佳效果.如果有可能生成每像素4位调色板,那将是最好的.

c image-processing dithering color-palette

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

C中的非ASCII字符

我正在查看谷歌go的运行时源代码(在https://go.googlecode.com/hg/src/pkg/runtime/),似乎他们使用特殊字符作为其函数名称,·.(例如,访问https://go.googlecode.com/hg/src/pkg/runtime/cgocall.c).这是否被主要编译器接受?它不是ANSI C,是吗?或者它只是一些宏观魔法?

谢谢!

c namespaces ansi naming-conventions standards-compliance

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

在OCaml中扩展不可变类型(或:不可变类型的快速缓存)

我在ocaml中有一个递归的不可变数据结构,可以简化为这样的:

type expr =
{
    eexpr : expr_expr;
    some_other_complex_field : a_complex_type;
}

and expr_expr =
    | TInt of int
    | TSum of (expr * expr)
    | TMul of (expr * expr)
Run Code Online (Sandbox Code Playgroud)

这是一个AST,有时它变得非常复杂(它非常深).

有一个递归函数来计算表达式.例如,让我们说,

let rec result expr =
    match expr.eexpr with
        | TInt i -> i
        | TSum (e1, e2) -> result e1 + result e2
        | TMul (e1, e2) -> result e1 * result e2
Run Code Online (Sandbox Code Playgroud)

现在假设我将一个表达式映射到另一个表达式,我需要不断检查expr的结果,有时不止一次检查同一个expr,有时候对于最近使用该模式映射的表达式

{ someExpr with eexpr = TSum(someExpr, otherExpr) }
Run Code Online (Sandbox Code Playgroud)

现在,结果函数非常轻量级,但是对于深度AST运行多次将不会非常优化.我知道我可以使用Hashtbl缓存值,但AFAIK Hashtbl只会进行结构相等,所以无论如何它都需要遍历我的长AST.我知道最好的选择是在expr类型中包含一个可能不可变的"result"字段.但我不能.

那么在Ocaml中是否有任何方法可以将值缓存到不可变类型,所以每次需要它时都不必急切地计算它?

谢谢!

caching ocaml hashtable immutability

5
推荐指数
2
解决办法
312
查看次数