在某些情况下,是否有任何令人信服的性能原因选择静态链接而不是动态链接?我已经听过或读过以下内容,但我对这个问题的了解不足以保证它的真实性.
1)静态链接和动态链接之间的运行时性能差异通常可以忽略不计.
2)(1)如果使用使用配置文件数据优化程序热路径的配置文件编译器,则不成立,因为使用静态链接,编译器可以优化代码和库代码.通过动态链接,您的代码可以进行优化.如果大部分时间都花在运行库代码上,那么这可能会产生很大的不同.否则,(1)仍然适用.
我想做这样的事情:
f = Foo(bar='x')
session.add(f)
session.flush()
# do additional queries using f.id before commit()
print f.id # should be not None
session.commit()
Run Code Online (Sandbox Code Playgroud)
但是当我尝试时,f.id是None.我怎样才能让它发挥作用?
-担
我已经观察了一段时间C#程序员倾向于在任何地方使用int,并且很少使用uint.但我从来没有找到一个令人满意的答案为什么.
如果您的目标是互操作性,则uint不应出现在公共API中,因为并非所有CLI语言都支持无符号整数.但这并不能解释为什么int如此普遍,即使在内部课程中也是如此.我怀疑这是因为在BCL中谨慎使用uint的原因.
在C++中,如果你有一个负值没有意义的整数,你选择一个无符号整数.
这清楚地表明不允许或不期望负数,编译器会为您做一些检查.我还怀疑在数组索引的情况下,JIT可以轻松地删除下限检查.
但是,在混合int和单位类型时,需要额外的护理和演员表.
是否应该使用更多?为什么?
我有一系列新对象.它们看起来都像这样:
Foo(pk_col1 = x,pk_col2 = y,val ='bar')
其中一些是存在的Foo(即只有val与db中的行不同)并且应该生成更新查询.其他人应该生成插入.
我可以想到几种方法,最好的方式:
pk_cols = Foo.table.primary_key.keys()
for f1 in foos:
f2 = Foo.get([getattr(f1, c) for c in pk_cols])
if f2 is not None:
f2.val = f1.val # update
# XXX do we need to do session.add(f2)
# (or at least keep f2 alive until after the commit?)
else:
session.add(f1) # insert
session.commit()
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法?
澄清问题:
当OS发送命令将扇区写入磁盘时它是原子的吗?即,如果电源在写入命令之后立即失败,则新数据的写入将完全成功或旧数据保持不变.我不关心多扇区写入会发生什么 - 撕裂的页面是可以接受的.
老问题:
假设您在磁盘上有旧数据X,您在其上写入新数据Y,并且在写入期间树落在电源线上.如果没有花哨的UPS或备用电池的磁盘控制器,最终可能会出现页面撕裂的情况,磁盘上的数据是X部分和Y部分.您是否最终会遇到磁盘上的数据是X部分,Y部分的情况和部分垃圾?
我一直在努力理解像数据库这样的ACID系统的设计,而且我的天真想法似乎是firebird,它不使用预写日志,依赖于给定的写入不会破坏旧数据(X) - 只能完全写入新数据(Y).这意味着如果要覆盖X的一部分,则只能更改被覆盖的X部分,而不是我们打算保留的部分X.
为了澄清,这意味着如果你有一个页面大小的缓冲区,说4096个字节,充满了一半Y,一半X,我们要保持 - 我们告诉OS编写过X该缓冲区,有严重的磁盘的任何事都不短在写入期间我们想要保留的半X被破坏的失败.
Windows具有VirtualAlloc,它允许您保留连续的地址空间区域,但实际上不使用任何物理内存.稍后当您想要使用它(或其中的一部分)时,再次调用VirtualAlloc以提交先前保留页面的区域.
这实际上非常有用,但我想最终将我的应用程序移植到linux - 所以如果我以后无法移植它,我不想使用它.linux有办法做到这一点吗?
编辑 - 用例
我正在考虑分配4 GB或一些这样的虚拟地址空间,但一次只能提交64K.这将为我提供一种零拷贝方式来生成高达4 GB的阵列.这一点很重要,因为典型的两倍数组大小和副本会为非常大的数组引入看似随机的不可接受的延迟.
OpenID是否改善了用户体验?
编辑
不要贬低其他评论,但我在下面得到了一个非常好的回复,概述了OpenID在理性底线方式中的3个优点.我还听到其他评论中的一些低语,你可以通过OpenID访问用户的一些细节(名称?电子邮件?什么?),使用它甚至可以通过不需要收集来简化注册过程尽可能多的信息.
在结账过程中肯定需要收集的东西:
(我很确定我自己要问这些)
从营销的角度来看,可能还有其他一些有趣的事情,但我不会要求用户手动输入在结账过程中不是绝对必需的任何内容.那么这方面有什么可能呢?
/编辑
(您可能已经注意到stackoverflow使用OpenID)
在我看来,用户只需输入他们必须经历的注册表单中的用户名和密码就更容易,更快捷.我的意思是你不要避免使用OpenID输入用户名和密码.但是,您可以避免选择OpenID提供商的混乱,以及从外部站点到外部和外部的旅程.
由于微软将Live ID作为OpenID提供商(更多信息),为Google,雅虎和其他公司提供的额外帐户增加了数亿个,这个问题比以往任何时候都更加重要.
我必须要求新客户在结账过程中进行注册,并且尽可能简单,顺利地进行体验绝对至关重要,每一点点都会变得难以转化为销售损失.在一天结束时,没有极客因素超过冷硬现金:)
OpenID似乎是一个不错的主意,但实现的价值有问题.OpenID的优点是什么?在我上面描述的场景中它真的值得吗?
我正在使用Visual Studio 2010和ReSharper 5.
我在.cs文件的顶部定义它.
#if X86
using size_t = System.Int32;
#else
using size_t = System.Int64;
#endif
Run Code Online (Sandbox Code Playgroud)
然后我可以使用size_t并知道它是一个本机整数,如果编译为32位汇编则为32位,如果编译为64位汇编则为64位.(对于那些好奇,替代品总是在IntPtr.Size == 4使用的Int64或分支机构在运行时间,并让代码的两个版本.我喜欢这样的解决方案.)
但是,如果我键入size_t并命中空格,它将自动转换为Int64(如果定义了X86,则为Int32).显然这是不可取的.
我进入了ReSharper选项并转到Environment\Intellisence\Completion行为并禁用了"自动完成单个项目:"下的所有复选框.
它仍然会发生,还有什么我可以尝试的吗?
我正在尝试在两种算法之间做出决定.一个写入8个字节(两个对齐的4字节字)到2个高速缓存行,另一个写入3个整个高速缓存行.
如果CPU只将更改的8个字节写回内存,则第一个算法使用的内存带宽要少得多:8个字节对192个字节.如果CPU写入整个高速缓存行,则128和192字节之间的差异不那么显着.
那么Intel Xeon CPU如何写回内存?你会惊讶地发现在谷歌找到一个应该众所周知的答案是多么困难.
据我了解,写入进入存储缓冲区,然后进入缓存.当脏缓存行从缓存中逐出时,它们可能只被写入内存,但是英特尔是否跟踪缓存行的哪些部分是脏的,或者只是转储整个内容?我更怀疑他们跟踪缓存行粒度以下的事情.如果在高速缓存行被驱逐之前有任何事情进入内存,我也会感到非常惊讶.
c# ×3
python ×2
sqlalchemy ×2
.net ×1
acid ×1
c ×1
c++ ×1
caching ×1
cpu-cache ×1
crash ×1
ienumerator ×1
intel ×1
intellisense ×1
linux ×1
openid ×1
optimization ×1
performance ×1
resharper ×1
virtualalloc ×1
x86 ×1