小编mgi*_*uca的帖子

为什么LLVM执行引擎比编译代码更快?

我有一个针对LLVM的编译器,我提供了两种运行代码的方法:

  1. 自动运行它.此模式将代码编译为LLVM,并使用ExecutionEngine JIT将其编译为机器代码,并在不生成输出文件的情况下运行它.
  2. 编译它并单独运行.此模式输出LLVM .bc文件,我手动优化(使用opt),编译为本机程序集(使用llc)编译为机器代码并链接(使用gcc),然后运行.

我期待方法#2比方法#1更快,或者至少相同的速度,但运行一些速度测试,我惊讶地发现#2持续运行大约两倍的速度.这是一个巨大的速度差异.

两种情况都运行相同的LLVM源代码.方法#1,我还没有打算运行任何LLVM优化传递(这就是为什么我期望它更慢).随着办法#2,我正在opt-std-compile-optsllc-O3,最大限度地优化,但它是不是接近#1成气候.以下是同一程序的示例运行:

  • 没有优化的#1:11.833s
  • 没有优化的#2:22.262s
  • #2优化(-std-compile-opts-O3):18.823s

ExecutionEngine是否做了一些我不知道的特殊事情?有没有办法让我优化编译代码以实现与ExecutionEngine JIT相同的性能?

llvm

44
推荐指数
2
解决办法
5210
查看次数

使Tk看起来像一个原生的Linux应用程序

浏览TkDocs网站,看起来Tk在"原生外观"部门已经走过了漫长的道路.但是看一下这些截图,它似乎在Linux中失败了.如果向下滚动该页面,您将看到一个看起来与Mac完全相同的Mac屏幕截图,一个看起来与Windows XP完全相同的Windows XP屏幕截图,以及一个看起来像...... Windows 98(或带有经典的Windows XP)的Linux屏幕截图样式).

我知道Linux并不真正具有"本机外观",因为每个工具包都有自己的样式.但是我想知道是否有任何方式来设置Tk,所以它看起来像GTK或Qt(最好是Gtk),所以它会融入Linux桌面上的大多数其他应用程序.

那么Windows Vista/7呢?我没有在这些平台上看到任何Tk截图.

linux tk-toolkit

37
推荐指数
3
解决办法
1万
查看次数

你如何模拟App Engine中的用户服务?

我正在使用Google App Engine testbed框架编写带有模拟对象的测试用例.这在此处记录.我已经使用mock database(Testbed.init_datastore_v3_stub)很好地运行了数据存储区测试,这使我的测试用例可以在一个快速,新鲜的数据库上运行,并为每个测试用例重新初始化.现在我想测试依赖于当前用户的功能.

还有一个名为testbed的服务Testbed.init_user_stub,我可以激活它来获取"假的"用户服务.不幸的是,这个似乎没有任何文档.我正在激活并使用它:

import unittest
from google.appengine.ext import testbed
from google.appengine.api import users

class MyTest(unittest.TestCase):
    def setUp(self):
        self.testbed = testbed.Testbed()
        self.testbed.activate()
        self.testbed.init_user_stub()

    def testUser(self):
        u = users.get_current_user()
        self.assertNotEqual(u, None)
Run Code Online (Sandbox Code Playgroud)

问题是我没有找到任何方法告诉"假"用户服务来验证"假"用户.所以运行那个测试,我(可以预见)得到

AssertionError: None == None
Run Code Online (Sandbox Code Playgroud)

意味着假用户服务告诉我的应用程序当前用户没有登录.如何判断虚假用户服务假装用户已登录?理想情况下,我希望能够指定假用户的昵称,电子邮件,user_id以及他们是否是管理员.这似乎是一个非常普遍的想要(因为你需要测试应用程序的行为时a)没有人登录,b)用户登录,和c)管理员登录),但谷歌搜索"init_user_stub"几乎没有返回任何内容.

注意:如果要测试上述程序,则需要将其添加到顶部:

import sys
sys.path.append('/PATH/TO/APPENGINE/SDK')
import dev_appserver
dev_appserver.fix_sys_path()
Run Code Online (Sandbox Code Playgroud)

这到底:

if __name__ == '__main__':
    unittest.main()
Run Code Online (Sandbox Code Playgroud)

python google-app-engine

21
推荐指数
3
解决办法
3240
查看次数

C++令人困惑的成员模板的属性名称

我发现当v.foo从模板类型(T& v)的变量访问非模板属性()时,如果存在相同名称的模板函数(),可以欺骗C++认为它是成员模板template class <T> void foo().如何从C++规范中解释这一点?考虑这个简单的程序:

#include <cassert>

/** Determine whether the 'foo' attribute of an object is negative. */
template <class T>
bool foo_negative(T& v)
{
    return v.foo < 0;
}

struct X
{
    int foo;
};

int main()
{
    X x;
    x.foo = 5;
    assert(!foo_negative(x));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我们有一个模板函数foo_negative,它接受任何类型的对象并确定其foo属性是否为负数.该main函数foo_negative用[T = X] 实例化.该程序编译并运行,没有任何输出.

现在,将此函数添加到程序的顶部:

template <class T>
void foo()
{
}
Run Code Online (Sandbox Code Playgroud)

使用G ++ 4.6.3进行编译会导致此编译器错误:

funcs.cpp: In function …
Run Code Online (Sandbox Code Playgroud)

c++ templates

18
推荐指数
3
解决办法
3528
查看次数

GCC链接顺序发生了变化?

我试图使用GCC链接C++模块,基本上是这样的:

gcc -c hello.c
g++ -c world.cpp
gcc -ohello -lstdc++ hello.o world.o
Run Code Online (Sandbox Code Playgroud)

请注意,我-lstdc++用来链接C++模块,以便我可以使用gcc而不是g++.问题是我收到了错误:

undefined reference to `operator new(unsigned long)'
Run Code Online (Sandbox Code Playgroud)

(假设world.cpp至少包含一次调用new.)

如果我放在-lstdc++链接器行的末尾,则会修复此错误,如下所示:

gcc -ohello hello.o world.o -lstdc++
Run Code Online (Sandbox Code Playgroud)

我知道这个问题在这里被多次询问过,但我有一个特殊的要求.我不直接打电话给海湾合作委员会.我正在为不同的编程语言(Mercury)使用构建系统,它代表我调用GCC,我不能轻易修改它调用GCC的方式(尽管我可以使用LDFLAGS环境变量指定其他库).所以我有两个额外的要求:

  • 我不能使用g++链接(仅gcc) - 这就是为什么我在做-lstdc++上面的技巧而不是简单地链接g++).
  • 我不认为我可以控制链接器命令的顺序 - Mercury会任何库之后将.o文件放在命令行上.

我理解的根本原因的顺序很重要,但什么是莫名其妙我是为什么会出现这种突破呢?我刚刚更新到Ubuntu 11.10/GCC 4.6.1.我已经成功地使用上述技术(-lstdc++首先放置)编译了这个程序多年.只是现在才出现这个错误.一个不相关的我的程序与OpenGL的使用链接-lgl,当我升级时我也不得不移动-lgl到命令行的末尾.我可能会发现我的几十个程序不再编译.为什么这会改变?我的新系统有问题还是现在的样子?请注意,这些是普通的共享库,而不是静态链接.

有什么办法可以让GCC回到原来的方式,图书馆的顺序无关紧要吗?有没有其他方法可以说服GCC libstdc++正确链接而不.o在命令行上的文件后移动它?

linker gcc

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

是否可以将用户的盐保存在与密码哈希相同的表中?

它没关系并且没用吗?它可以保存在另一个表甚至另一个数据库中.

你怎么看?

PS为了更高的安全性,我也有恒定的盐"花生".它是保存在配置文件中的常量值(不在数据库中).因此,如果黑客想以某种方式破解密码,他也需要访问文件服务器和数据库.

passwords hash salt password-protection

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

逃离Continuation monad中的IO monad

令人困惑的问题令人困惑的标题!我理解a)monad,b)IO monad,c)Cont monad(Control.Monad.Cont),以及d)ContT连续变换器monad.(而且我模糊地理解monad变换器 - 虽然还不足以回答这个问题.)我理解如何编写一个程序,其中所有函数都在Cont monad(Cont r a)中,我理解如何编写一个程序,其中所有的函数在组合的Cont/IO monad(ContT r IO a)中.

但我想知道如何编写一个程序,其中某些函数在组合的Cont/IO monad(ContT r IO a)中,其他函数只在Cont monad(Cont r a)中.基本上,我想以连续样式编写整个程序,但只在必要时使用IO monad(很像"常规"Haskell代码,我只在必要时使用IO monad).

例如,以非延续样式考虑这两个函数:

foo :: Int -> IO Int
foo n = do
    let x = n + 1
    print x
    return $ bar x

bar :: Int -> Int
bar m = m * 2
Run Code Online (Sandbox Code Playgroud)

请注意,foo需要IO但是bar …

monads continuations haskell

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

python"re"包,带有"raw"字符串的奇怪现象

我看到以下现象,似乎无法弄清楚,并没有通过档案搜索找到任何东西:

如果我输入:

>>> if re.search(r'\n',r'this\nis\nit'):<br>
...     print 'found it!'<br>
... else:<br>
...     print "didn't find it"<br>
... 
Run Code Online (Sandbox Code Playgroud)

我会得到:

didn't find it!
Run Code Online (Sandbox Code Playgroud)

但是,如果我输入:

>>> if re.search(r'\\n',r'this\nis\nit'):<br>
...     print 'found it!'<br>
... else:<br>
...     print "didn't find it"<br>
... 
Run Code Online (Sandbox Code Playgroud)

然后我会得到:

found it!
Run Code Online (Sandbox Code Playgroud)

(第一个在r'\n'上只有一个反斜杠,而第二个在r'\\n'上连续有两个反斜杠......即使这个解释器正在删除其中一个.)

我可以猜到正在进行,但我不明白为什么会发生这种情况的官方机制:在第一种情况下,我需要逃避两件事:正则表达式和特殊字符串."Raw"让我逃避特殊字符串,但不是正则表达式.

但是第二个字符串中永远不会有正则表达式,因为它是匹配的字符串.所以只需要逃脱一次.

但是,某些东西对我来说似乎并不一致:我怎么能确保在第一种情况下字面上的字符确实是真的?我可以输入rr''吗?或者我必须确保我逃避两次?在类似的情况下,我如何确保变量是按字面意思(或不是字面意义)?例如,如果我有一个变量tmp ='this \nis \nmy \nhome',我真的想找到斜杠和'n'的文字组合,而不是换行符怎么办?

谢谢!
麦克风

python regex

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

使用SCons构建相对于src /目录

我有一个以下的应用程序(我认为很常见)目录层次结构:

/src
    subdir1/  # Subdirs with more source files.
        more.c
        SConscript
    foo.c     # Source files.
    foo.h
    SConscript
/other        # Other top-level directories with no source code.
/stuff        # However, there are other assets I may want to build.
README        # Other top-level files.
SConstruct
Run Code Online (Sandbox Code Playgroud)

问题是,当我scons从顶级目录运行时,它gcc从该目录调用而不cd进入src,如下所示:

gcc -o src/foo.o src/foo.c
Run Code Online (Sandbox Code Playgroud)

由于以下几个原因,这是有问题的:

  1. 在我的程序中,我#include提供了相对于src目录的路径.例如,more.c可能包括foo.h#include "foo.h".这会失败,因为GCC是从父目录运行的.我不想改变我的包含#include "src/foo.h".
  2. 我使用__FILE__特殊的宏来记录日志.当从顶级目录构建时,GCC将" src/"放在所有文件名的前面,因为那是它被编译的路径.这可能看起来很挑剔,但我不希望这样,因为我认为我的源树是相对于src目录的. …

scons

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

Windows:更改与文件类型关联的应用程序的名称/图标

我想将Windows中的文件类型与特定应用程序相关联,但我需要在用户打开"打开方式"菜单时将其设置为,该列表中应用程序的名称和图标是针对该文件类型自定义的(即,不仅仅是可执行文件的名称和图标).

这是因为二进制文件是一个通用二进制文件,它运行许多不同的应用程序,具体取决于它的命令行参数(类似于python.exejavaws.exe).我不希望"打开方式"菜单显示"Python"或"Java",我希望它显示在命令行上传递的应用程序的名称和图标.

我知道如何添加文件关联(通过创建一个进程idHKEY_CLASSES_ROOT,并添加程序id名称要么OpenWithProgidsHKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts),但因为它出现在"打开方式"菜单中我找不到任何方式更改名称或应用程序的图标对于那种类型的文件.这可能吗?

(编辑以阐明我对添加文件关联的现有理解.)

windows registry file-association

5
推荐指数
0
解决办法
8568
查看次数