我很想知道如何在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函数已经尝试捕获任何异常,然后将其转换为这种格式?
谢谢!
我正在研究实现一个简单的开源对象时态数据库的最佳数据结构,目前我非常喜欢使用持久性红黑树来实现它.
我使用持久数据结构的主要原因首先是最小化锁的使用,因此数据库可以尽可能并行.此外,实现ACID事务更容易,甚至能够抽象数据库以在某种集群上并行工作.这种方法的好处在于它几乎可以免费实现时态数据库.这是非常好的,特别适用于网络和数据分析(例如趋势).
所有这些都非常酷,但我对在磁盘上使用持久数据结构的整体性能有点怀疑.即使今天有一些非常快的磁盘可用,并且所有写入都可以异步完成,所以响应总是立竿见影,我不想在错误的前提下构建所有应用程序,只是意识到它并不是真的好这样做的方式.
这是我的思路: - 由于所有写入都是异步完成的,并且使用持久数据结构将不会使先前(当前有效)结构无效,因此写入时间实际上不是瓶颈.- 有一些关于此类结构的文献正是针对磁盘使用的.但在我看来,这些技术将增加更多的读取开销,以实现更快的写入.但我认为恰恰相反是可取的.这些技术中的许多确实最终会使用多版本树,但它们并不是严格不可变的,这对于证明持久开销非常重要. - 我知道在向数据库附加值时仍然需要进行某种锁定,而且如果不是要维护所有版本,我也知道应该有一个好的垃圾收集逻辑(否则文件大小肯定会大幅上升) .还可以考虑增量压缩系统. - 在所有搜索树结构中,我真的认为红黑是最接近我需要的,因为它们提供最少的旋转次数.
但是在此过程中存在一些可能的缺陷: - 异步写入 - 可能会影响需要实时数据的应用程序.但我不认为Web应用程序就是这种情况,大部分时间都是如此.此外,当需要实时数据时,可以设计另一种解决方案,例如需要以更实时的方式工作的特定数据的登记/结账系统. - 它们也可能导致一些提交冲突,但我没有想到它何时会发生的好例子.如果两个线程使用相同的数据,那么正常的RDBMS中也会发生冲突,对吧? - 拥有像这样的不可变接口的开销将呈指数级增长,一切都注定要很快失败,所以这一切都是个坏主意.
有什么想法吗?
谢谢!
编辑:似乎存在对持久性数据结构的误解:http: //en.wikipedia.org/wiki/Persistent_data_structure
database binary-tree functional-programming immutability data-structures
我正在编写一个haXe C#目标,并且我一直在研究haXe的std库的性能差异,因此我们可以通过其跨平台代码提供最佳性能.
一个非常好的例子是哈希表代码.我有点不情愿使用.NET的字典,因为它看起来很笨重(键/值对的结构可能占用大量的内存,因为内存对齐问题,除了它所持有的不必要的信息),并且因为在std上库没有对象哈希这样的东西,我真的以为我可以通过不必调用GetHashCode来压缩一点性能,并一直内联它.
同样很明显,Dictionary实现使用链表来处理冲突,这远非理想.
所以我们开始实现我们自己的解决方案,从IntHash(Dictionary)开始我们首先实现了Hopscotch哈希,但它实际上并没有很好,但很明显它不支持非常好的哈希表,因为H通常是机器字,并且随着H /长度的增加,性能越差.
然后我们跳转到实现khash -inspired算法.这个具有很大的潜力,因为它的基准测试令人印象深刻,并且它处理同一阵列上的冲突.它也有一些很棒的东西,比如调整大小而不需要像我们那样需要两倍的内存.
基准令人失望.当然,没有必要说我们的实现中的内存使用量远低于Dictionary的内存使用率.但我希望也能获得不错的性能提升,但不幸的是,情况并非如此.它不是太低 - 不到一个数量级 - 但对于两个集合和获取,.NET的实现仍然表现更好.
所以我的问题是:这是我们对C#的最佳选择吗?我试着寻找任何自定义解决方案,似乎几乎没有.有C5通用集合,但代码是如此混乱,我甚至没有测试.我也找不到基准.
那么......是吗?我应该绕着Dictionary <>吗?
谢谢!!!
我正在研究GC实现,我正在寻找引用和良好的开源GC示例.
有没有好的和简单的代际GC实现?第二个最好的事情是良好的资源和指导方针!
谢谢!
假设我们有两个结构:
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规范对此有何规定?我知道有些编译器可以选择重新排序结构字段以优化内存使用,这可能会使两个结构不兼容.有没有办法确定这段代码是否有效,无论编译器标志如何?
谢谢!
内部类比普通类更轻量级,还是最终java像普通类一样编译内部类?
我知道在java类不都是非常轻巧自己,他们占据了PermGen的内存的一部分,所以我想知道这是否是最好用的类似于闭包功能的内部类,或者如果标准类也做得很好?
我试过反汇编一个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) 我刚刚读到Google Go默认情况下如何使每个线程的堆栈大小减少,然后如果发生溢出则链接到新堆栈(参见此处的第16页).我想知道在C中做到这一点的最好方法.
我不得不说我不是C专家,所以可能有更好的方法来检测C上的Stack Overflow,但是我无知,这就是我认为我会实现它的方式:
我想到的第一件事是每次我们有一个新的堆栈,我们得到一个堆栈变量的地址,并且我们大致有起始堆栈地址.然后我们需要能够检索线程有多少堆栈空间.如果线程不是主线程,这是可能的,但我不知道如何在C上获取此信息.
然后我们需要通过检索当前堆栈变量地址来检查(每个函数调用,它可能是)已经使用了多少堆栈.如果我们检测到可能的堆栈溢出,我们需要有一些方法来创建一个新的堆栈并链接到最后一个堆栈.我认为可以在C中完成的唯一方法是创建一个新线程来执行我们想要的函数,并锁定当前线程直到函数返回其结果.
那么,是否有更清洁/更好的方法来实现这一点?
谢谢!
我刚刚阅读了关于scala实现泛型专业化的内容,它确实引起了我的注意,他们通过这个功能提高了速度.我想知道其他功能有哪些语言针对java vm实现,实际上使它们比java更好?我知道生成的代码越远离java,其性能就越低.所以我真的很想知道语言可以实现哪些其他功能来实现更好的java性能.
请不要回答这个问题,谈论scala在java之上的非常好的功能,我正在严格谈论性能.
如果您的建议仍未实施,请回答!
谢谢!
我希望有一个标准函数将相对路径转换为绝对路径,如果可能的话,我想尽可能使它成为跨平台(所以我想避免调用外部库函数).这样做是为了防止路径攻击.
我知道这样的函数无法检测符号链接,但我对我的应用程序没问题.
我可以滚动自己的代码,但可能存在一些问题,例如平台如何处理"../"模式的编码或变体.
是否有类似的东西已经实施?
我正在开发一个与OpenGL一起使用的纹理图册打包器,我正在寻找一个开源(如果它是一个库,它会更好,但开源软件也会更好!)解决方案调色板创建/抖动的最佳结果.它确实不需要很快,但需要达到最佳效果.如果有可能生成每像素4位调色板,那将是最好的.
我正在查看谷歌go的运行时源代码(在https://go.googlecode.com/hg/src/pkg/runtime/),似乎他们使用特殊字符作为其函数名称,·.(例如,请访问https://go.googlecode.com/hg/src/pkg/runtime/cgocall.c).这是否被主要编译器接受?它不是ANSI C,是吗?或者它只是一些宏观魔法?
谢谢!
我在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中是否有任何方法可以将值缓存到不可变类型,所以每次需要它时都不必急切地计算它?
谢谢!
c ×6
ansi ×2
c# ×2
hashtable ×2
immutability ×2
internals ×2
java ×2
ocaml ×2
binary-tree ×1
c89 ×1
caching ×1
casting ×1
closures ×1
clr ×1
database ×1
delegates ×1
dithering ×1
exception ×1
go ×1
hash ×1
il ×1
longjmp ×1
namespaces ×1
optimization ×1
performance ×1
permgen ×1
resources ×1
scala ×1
security ×1
struct ×1