小编Jet*_*tti的帖子

Haskell列表理解是否效率低下?

我开始做项目欧拉并得到问题9.由于我使用Project Euler来学习Haskell,我决定使用列表推导(如Learn You A Haskell中所示).我这样做,GHCI需要一段时间来弄清楚三元组,由于涉及的计算,我认为这是正常的.现在,昨天上班(我不是专业的程序员),我正在和一位了解VBA的朋友交谈,他想尝试在VBA找到答案.我认为这也是一个有趣的挑战,我为ch循环和if语句制作了一些基本的东西,但是我得到的是它比Haskell快得多.

我的问题是:Haskell的列表理解是否非常低效?起初我以为这只是因为我处于GHC的交互模式,但后来我意识到VBA也被解释了.

请注意,我没有发布我的代码,因为它是项目euler的答案.如果它会回答我的问题(因为我做错了),那么我很乐意发布代码.

[编辑]这是我的Haskell列表理解:
[(a,b,c) | c <- [1..1000], b <- [1..c], a <- [1..b], a+b+c=1000, a^2+b^2=c^2]
我想我可以降低c的范围,但是真正放慢它的速度是什么?

performance vba haskell list-comprehension

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

在现实世界中曾经使用过"伪造的减法"吗?

我正在参加计算机系统课程作为我的硕士课程的预先要求,并且遇到了一些令我着迷并且很难看到实际用途的东西,那就是"伪造减法"以及不需要减法的事实指令.

就像是:

x - y

可以写成:

x +(~y + 1)

现在,这一切都很好,但似乎对于简单的减法来说过于复杂,特别是当你可以轻松地放入"x - y"时.是否有必要这样做的情况,或者只是可以做但不是的事情.

c

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

为什么将Int32转换为Float64会导致数据发生变化?

我正在教自己CIL并且到目前为止一直做得很好(昨天真的开始)但我遇到了一个我无法弄清楚的问题.我正在提示用户输入一个int(int32),然后将其存储并转换为浮点并显示它.然而,无论我输入什么都是不同的浮动.这是我的代码:

.assembly variables {}
.method public static void main() cil managed
{
    .entrypoint
    .maxstack 8
    .locals init (float64)

    ldstr "Enter a digit: "
    call void [mscorlib]System.Console::WriteLine(string)
    call int32 [mscorlib]System.Console::Read()
    conv.r8
    stloc.0
    ldstr "as a float: "
    call void [mscorlib]System.Console::WriteLine(string)
    ldloc.0
    dup
    call void [mscorlib]System.Console::Write(float64)
    stloc.0
    ldstr "Stored in location 0"
    call void [mscorlib]System.Console::WriteLine(string)
    ldloc.0
    conv.i4
    call void [mscorlib]System.Console::WriteLine(int32)
    call int32 [mscorlib]System.Console::Read() // to pause before closing window
    pop
    ret
}
Run Code Online (Sandbox Code Playgroud)

我只是在和CIL搞砸,但我觉得为了清晰起见,我会把整个例子都扔进去.它编译得很好但是当我输入5时它返回53作为浮点数和转换后的int32.

有人可以说明我做错了什么!


编辑:感谢Marc Gravell,我能够弄明白.对于那些感兴趣的人,这里是正确的代码:

.assembly variables {}
.method …
Run Code Online (Sandbox Code Playgroud)

.net il cil

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

在子查询的where子句中使用select查询中的字段

我有一个人员列表,可以发生4种类型,每种类型有5种分辨率.我正在尝试编写单个查询,以便我可以为每个人提取每种类型/分辨率组合但遇到问题.这是我到目前为止:

SELECT person,
   TypeRes1 = (SELECT COUNT(*) FROM table1 where table1.status = 45)
JOIN personTbl ON personTbl.personid = table1.personid
WHERE person LIKE 'A0%'
GROUP BY person
Run Code Online (Sandbox Code Playgroud)

我已经调整了列名以使其更加通用,但基本上人员表中有几百人,我只想要A01到A09,所以like语句是最简单的方法.问题是我的结果最终是这样的:

Person  TypeRes1
A06     48
A04     48
A07     48
A08     48
A05     48
Run Code Online (Sandbox Code Playgroud)

这是不正确的.我无法弄清楚如何让每个人的列数正确.我尝试过这样的事情:

SELECT person as p,
TypeRes1= (SELECT COUNT(*) FROM table1 
JOIN personTbl ON personTbl.personid = table1.personid
WHERE table1.status = 45 AND personTbl.person = p)
FROM table1
JOIN personTbl ON personTbl.personid = table1.personid
WHERE personTbl.person LIKE 'A0%'
GROUP BY personTbl.person
Run Code Online (Sandbox Code Playgroud)

但这给了我错误:无效的列名'p'.是否可以将p传递到子查询中,还是有其他方法可以执行此操作?

编辑:有19种不同的状态,所以会有19种不同的TypeRes,为了简洁起见,我只想把它放在一个好像我能找到它,我想我可以自己做其余的.

t-sql

2
推荐指数
1
解决办法
1359
查看次数

当代码生成使用JIT瞄准运行时时,是否需要进行优化?

我打算编写一个针对.NET平台的编程语言,这让我开始考虑定位这样一个平台的代码生成方面.我是编写编译器的新手,但我知道在编译(或可能存在)的过程中有一个优化完成.我开始怀疑花时间优化输出有什么好处(在这种情况下是CIL,但这也适用于JVM),因为JIT编译器和JVM的HotSpot之类的东西可以在运行时进行优化.由于JIT已经优化,因此在针对.NET或JVM时优化生成的代码(CIL或等效的JVM)有什么好处吗?

compiler-construction optimization code-generation

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