小编Mat*_*aws的帖子

涉及Intel SnB系列CPU上的微编码指令的循环分支对齐

这与此问题有关,但不一样:x86-64汇编的性能优化 - 对齐和分支预测与我之前的问题略有关系:无符号64位到双倍转换:为什么这个算法来自g ++

以下是一个不真实的测试用例.这种素性测试算法是不明智的.我怀疑任何真实世界的算法都不会执行如此多的小内循环(num大概是2**50的大小).在C++ 11中:

using nt = unsigned long long;
bool is_prime_float(nt num)
{
   for (nt n=2; n<=sqrt(num); ++n) {
      if ( (num%n)==0 ) { return false; }
   }
   return true;
}
Run Code Online (Sandbox Code Playgroud)

然后g++ -std=c++11 -O3 -S生成以下内容,包含RCX n和包含XMM6 sqrt(num).请参阅我之前发布的剩余代码(在此示例中从未执行过,因为RCX永远不会变得足够大,不能被视为带符号的否定).

jmp .L20
.p2align 4,,10
.L37:
pxor    %xmm0, %xmm0
cvtsi2sdq   %rcx, %xmm0
ucomisd %xmm0, %xmm6
jb  .L36   // Exit the loop
.L20:
xorl    %edx, %edx
movq    %rbx, %rax …
Run Code Online (Sandbox Code Playgroud)

performance x86 assembly intel micro-optimization

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

无符号64位到双转换:为什么这个算法来自g ++

如果我编译,使用g ++ 4.9.2

bool int_dbl_com(const unsigned long long x, const double y)
{
    return x <= y;
}
Run Code Online (Sandbox Code Playgroud)

那么汇编程序输出(对于Windows x64调用约定)是:

testq     %rcx, %rcx            # x in RCX
js        .L2
pxor      %xmm0, %xmm0
cvtsi2sdq %rcx, %xmm0
ucomisd   %xmm0, %xmm1          # y in XMM1
setae     %al
ret
Run Code Online (Sandbox Code Playgroud)

该命令cvtsi2sdq签名转换,第一个测试和跳转组合是检查是否%rcx < 0.如果是这样,我们去L2,我不明白:

.L2:
movq       %rcx, %rax
andl       $1, %ecx
pxor       %xmm0, %xmm0
shrq       %rax
orq        %rcx, %rax
cvtsi2sdq  %rax, %xmm0
addsd      %xmm0, %xmm0
ucomisd    %xmm0, %xmm1
setae      %al …
Run Code Online (Sandbox Code Playgroud)

floating-point assembly g++ x86-64

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

当我将测试放在一个单独的目录中时,pytest找不到包

我有一个非常基本的Python包示例和我正在尝试使用pytest运行的测试

package
 \--
   __init__.py
   spam.py
   spam_test.py
Run Code Online (Sandbox Code Playgroud)

__init__.py为空,spam.py定义单个函数func(),spam_test.py并且:

import package.spam

def test_func():
    assert(package.spam.func() == 5)
Run Code Online (Sandbox Code Playgroud)

在我运行的根目录中py.test,一切正常,返回一个通过测试.

以为我也可以用这种方式构建东西:

package
 \--
   __init__.py
   spam.py
tests
 \--
   spam_test.py
Run Code Online (Sandbox Code Playgroud)

但现在当我py.test在根中运行时,我得到:

============================= test session starts =============================
platform win32 -- Python 3.6.0, pytest-3.0.5, py-1.4.32, pluggy-0.4.0
rootdir: C:\Users\MattUser\Documents\m_drive\notebooks\testing, inifile:
collected 0 items / 1 errors

=================================== ERRORS ====================================
_____________________ ERROR collecting tests/spam_test.py _____________________
ImportError while importing test module 'C:\Users\MattUser\Documents\m_drive\not
ebooks\testing\tests\spam_test.py'.
Hint: make sure your test modules/packages …

pytest python-3.x

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

为什么没有认识到平等搞乱C#List <T>排序?

这是一个有点模糊的问题,但是在浪费了一个小时追踪这个bug后,我觉得值得一提......

我写了一个自定义的订单struct,并犯了一个错误:

  • 我的结构有一个特殊的状态,让我们称之为"min".
  • 如果结构处于最小状态,那么它比任何其他结构小.
  • 我的CompareTo方法犯了一个错误:只要是"min" a.CompareTo(b)就会返回,但当然如果也是"min"它应该返回0.-1ab

现在,这个错误完全弄乱了一个List<MyStruct> Sort()方法:整个列表(有时)会以随机顺序出现.

  • 我的列表中只包含一个处于"min"状态的对象.
  • 似乎我的错误只会影响事物,如果将一个"min"对象与自身进行比较.
  • 排序时为什么会发生这种情况?
  • 即使它确实如此,它又如何导致两个"非最小"对象的相对顺序错误?

使用LINQ OrderBy方法可能会导致无限循环...

小巧,完整,测试示例:

struct MyStruct : IComparable<MyStruct>
{
    public int State;
    public MyStruct(int s) { State = s; }
    public int CompareTo(MyStruct rhs)
    {
        // 10 is the "min" state.  Otherwise order as usual
        if (State == 10) { return -1; } // Incorrect
        /*if (State == 10) // Correct version
        {
            if (rhs.State == 10) { …
Run Code Online (Sandbox Code Playgroud)

c# list

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

从错误的线程中垃圾收集的 Tkinter 对象

我似乎tkinter通过使用一些多线程来破坏linux。据我所知,我设法在不是主 GUI 线程的线程上触发垃圾回收。这导致__del__在一个tk.StringVar实例上运行,该实例试图tcl从错误的线程调用堆栈,从而导致 linux 上的混乱。

下面的代码是我能想出的最小例子。请注意,我没有用 做任何实际工作matplotlib,但否则我无法触发问题。在__del__对方法Widget验证的Widget情况下被从其他线程删除。典型的输出是:

Running off thread on 140653207140096
Being deleted... <__main__.Widget object .!widget2> 140653210118576
Thread is 140653207140096
... (omitted stack from from `matplotlib`
  File "/nfs/see-fs-02_users/matmdpd/anaconda3/lib/python3.6/site-packages/matplotlib/text.py", line 218, in __init__
    elif is_string_like(fontproperties):
  File "/nfs/see-fs-02_users/matmdpd/anaconda3/lib/python3.6/site-packages/matplotlib/cbook.py", line 693, in is_string_like
    obj + ''
  File "tk_threading.py", line 27, in __del__
    traceback.print_stack()
...
Exception ignored in: <bound method Variable.__del__ of <tkinter.StringVar object at 0x7fec60a02ac8>>
Traceback …
Run Code Online (Sandbox Code Playgroud)

tkinter matplotlib python-multithreading python-3.x

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

Python tkinter 树视图列大小

我有一个Treeviewin tkinter(Linux 上的 Python 3.6,但 Windows 上也发生同样的情况),我用它来模拟一种电子表格布局。我的问题是,如果我运行下面的示例代码,并调整“第 1 列”的大小,那么随着“第 1 列”变大,“第 2 列”变小。但是,如果我将最后一列拖到右侧,滚动条就会展开,现在我可以调整第 1 列的大小而不更改第 2 列的大小(而是整个树视图展开)。如果您随后再次调整第 1 列的大小,直到所有列都适合视图,则行为似乎会恢复为原始状态。

是什么导致了这种行为的改变?两者,我怎样才能阻止它,以及如何确保它是默认的?

最小工作示例:

import tkinter as tk
import tkinter.ttk as ttk

root = tk.Tk()
root.columnconfigure(0, weight=1)
root.rowconfigure(0, weight=1)

tree = ttk.Treeview(root)
tree["show"] = "headings"
tree["columns"] = list(range(3))
for i in range(3):
    tree.heading(i, text="Column {}".format(i))

for i in range(5):
    tree.insert('', "end", i)

tree.grid(row=0, column=0, sticky=(tk.N, tk.S, tk.E, tk.W))
xs = ttk.Scrollbar(root, orient=tk.HORIZONTAL, command=tree.xview)
tree["xscrollcommand"] = xs.set
xs.grid(row=1, column=0, …
Run Code Online (Sandbox Code Playgroud)

python tkinter python-3.x

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