小编Med*_*o42的帖子

测量python中的已用时间

是否有一个简单的方法/模块来正确测量python中的已用时间?我知道我可以简单地调用time.time()两次并消除差异,但如果系统时间改变,那将产生错误的结果.当然,这不会经常发生,但它确实表明我在测量错误的东西.

使用time.time()测量持续时间,当你想想这是令人难以置信的回旋.您可以通过持续时间测量(由计时器执行)和已知绝对时间(手动设置或通过ntp设置)构建两个绝对时间测量值的差值,您根本不感兴趣.

那么,有没有办法直接查询这个"计时器时间"?我想它可以表示为没有有意义的绝对表示的毫秒或微秒值(因此不需要用系统时间进行调整).看一下似乎这正是System.nanoTime()Java中的内容,但我没有找到相应的Python函数,即使它应该(硬件技术上)比提供更容易time.time().

编辑:为了避免混淆并解决以下答案:这不是关于DST更改,我也不想要CPU时间 - 我想要经过的物理时间.它不需要非常细粒度,甚至不是特别准确.它只是因为有人决定将系统时钟设置为不同的值,所以不应该给我负的持续时间或者持续时间偏离几个数量级(高于粒度).以下是Python文档关于'time.time()'的内容:

"虽然此函数通常返回非递减值,但如果在两次调用之间设置了系统时钟,则它可以返回比先前调用更低的值"

这正是我想要避免的,因为它可能导致奇怪的事情,如时间计算中的负值.我现在可以解决这个问题,但我相信在可行的情况下学习使用适当的解决方案是一个好主意,因为有一天克拉奇会回来咬你.

编辑2:一些研究表明,你可以通过使用GetTickCount64()在Windows中获得我想要的系统时间独立测量,在Linux下你可以在times()的返回值中得到它.但是,我仍然找不到在Python中提供此功能的模块.

python windows time duration

49
推荐指数
5
解决办法
7万
查看次数

如何在Java中扩展不可变类型

在使用"公共最终字段"方法时,我开始在游戏项目中使用Java中的不可变值对象:

public class Team {
    public final String name, flag;

    public Team(String name, String flag) {
        this.name = name;
        this.flag = flag;
    }
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,这对我来说非常有效,但我需要在不同情况下提供有关团队的各种额外信息.例如,团队在比赛期间具有设定的颜色.问题是,处理这些扩展信息集的最佳方法是什么?我知道这是一个相当普遍的问题,但我想继续使用不可变对象,这可能会影响解决方案.

以下是我提出的选项.他们中的大多数可能"足够好",但我想学习一些支持和反对它们的论据以供将来参考.

选项1:一个类中的所有内容

public class Team {
    public final String name, flag, colorName;
    public final int colorRgb;

    public Team(String name, String flag, String colorName, int colorRgb) {
        this.name = name;
        this.flag = flag;
        this.colorName = colorName;
        this.colorRgb = colorRgb;
    }
}
Run Code Online (Sandbox Code Playgroud)

对于所有用途,这只需要一个类,但是没有基于类型的指示来指示预期/提供的额外数据.

选项2:子类化

public class TeamWithColor extends Team {
    public final String colorName;
    public final int …
Run Code Online (Sandbox Code Playgroud)

java oop immutability

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

等待x秒或直到条件成立为止

如何等待x秒或直到条件变为真?应该在等待时定期测试这种情况.目前我正在使用此代码,但应该有一个简短的功能.

for (int i = 10; i > 0 && !condition(); i--) {
    Thread.sleep(1000);
}
Run Code Online (Sandbox Code Playgroud)

java sleep conditional-statements

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

MSVC和mingw之间的接口二进制兼容吗?

我正在开发一个库,允许其用户(驻留在同一进程中的其他库)交换数据缓冲区和流.该库必须可以从MSVC和mingw代码中使用(更多兼容性不会受到影响,但并非严格必要).为了实现这一点,核心功能应该从一个小的,与编译器兼容的接口提供,以后可以通过使用客户端代码编译的便利层来隐藏.

该库的一个具有挑战性的方面是它必须是可扩展的,以便客户端可以提供自己的缓冲区和流实现,但核心库接口必须在发布后保持稳定.如果您对进一步的背景感兴趣,可以在论坛帖子讨论中阅读.

我试图了解编译器之间二进制兼容性的问题,但由于我是这个主题的新手,我会对我的结果发表评论.我在这里的标准定义的行为(结构可能会失败那个测试),只能在MinGW和MSVC之间的相容性不感兴趣,也许其他的编译器,如果方便可行的.

特别是结构是否兼容?它们统一由函数指针组成,因此我认为填充不会成为问题.另外,这里需要stdcall约定,还是cdecl也能正常工作?我可以不指定它,因为两个编译器都默认为cdecl吗?我是不是该?这就是我现在所拥有的:

#include <stdint.h>

typedef struct {
        uint32_t (__stdcall *read)(void*, uint8_t*, uint32_t);
        void (__stdcall *write)(void*, const uint8_t*, uint32_t);
        uint32_t (__stdcall *getBytesLeft)(void*);
        uint8_t (__stdcall *destroy)(void*);
} SharedStreamInterface;

typedef struct {
        uint32_t (__stdcall *read)(void*, uint8_t*, uint32_t);
        void (__stdcall *write)(void*, const uint8_t*, uint32_t);
        uint32_t (__stdcall *getBytesLeft)(void*);
        uint8_t (__stdcall *destroy)(void*);

        uint32_t (__stdcall *getreadpos)(void*);
        uint32_t (__stdcall *getwritepos)(void*);
        uint32_t (__stdcall *getlength)(void*);
        void (__stdcall *setreadpos)(void*, uint32_t);
        void (__stdcall *setwritepos)(void*, uint32_t);
        void (__stdcall *setlength)(void*, uint32_t);
} SharedBufferInterface;

extern "C" {
        // Functions …
Run Code Online (Sandbox Code Playgroud)

compiler-construction mingw calling-convention binary-compatibility visual-c++

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

如何使用Reactive Extensions实现事件

Reactive Extensions允许您轻松订阅使用的活动Observable.FromEventPattern,但是当您拥有活动时,我找不到任何有关如何实施活动的信息IObservable.

我的情况是这样的:我需要实现一个包含事件的接口.每当我的对象的某个值发生变化时,就会调用该事件,出于线程安全的原因,我需要在某个事件上调用此事件SynchronizationContext.我也应该在注册时使用当前值调用每个事件处理程序.

public interface IFooWatcher
{
    event FooChangedHandler FooChanged;
}
Run Code Online (Sandbox Code Playgroud)

使用Rx获得一个可以完成我想要的观察是相当容易的BehaviorSubject:

public class FooWatcher
{
    private readonly BehaviorSubject<Foo> m_subject;
    private readonly IObservable<Foo> m_observable;

    public FooWatcher(SynchronizationContext synchronizationContext, Foo initialValue)
    {
        m_subject = new BehaviorSubject<Foo>(initialValue);
        m_observable = m_subject
            .DistinctUntilChanged()
            .ObserveOn(synchronizationContext);
    }

    public event FooChangedHandler FooChanged
    {
        add { /* ??? */ }
        remove { /* ??? */ }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在我正在寻找一种简单的方法有addremove功能的订阅和取消订阅传递的FooChangedHandler作为Observer<Foo>m_observable.我目前的实现看起来类似于: …

c# events system.reactive

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

clojure中的数据格式安全性

来自Java背景,我非常喜欢静态类型安全,并想知道clojure程序员如何处理数据格式定义的问题(可能不仅仅是类型而是一般不变量,因为类型只是一个特例.)

这类似于现有的问题"Clojure中的类型安全",但是更多地关注如何在编译时检查类型的方面,而我更关心如何解决问题.

作为一个实际例子,我正在考虑一个处理特定文档格式的编辑器应用程序.每个文档都包含几种不同的元素(图形元素,字体元素等).不同的元素类型都有编辑器,当然还有函数将文档转换为/到其本机的字节流 - 磁盘格式.

我感兴趣的基本问题是编辑器和读/写功能必须就通用数据格式达成一致.在Java中,我将文档的数据建模为对象图,例如,一个类代表一个文档,一个类用于每个元素种类.这样,我获得了关于数据结构的编译时保证,并且图形元素的字段"宽度"是整数而不是浮点数.它不保证宽度是正的 - 但使用getter/setter接口将允许相应的类添加这样的不变保证.

能够依赖于此使得处理此数据的代码更简单,并且可以在编译时或在运行时的早期捕获格式违规(其中一些代码尝试修改将违反不变量的数据).

如何在Clojure中实现类似的"数据格式可靠性"?据我所知,没有办法执行编译时检查并隐藏功能界面后面的域数据似乎不鼓励非惯用(或者我误解了?),那么Clojure开发人员做些什么才能感到安全传递给他们职能的数据格式?如何让代码尽快出错,而不是在用户再编辑20分钟并尝试保存到磁盘后,当保存功能注意到字体列表中有图形元素时编辑错误?

请注意我对Clojure和学习很感兴趣,但是还没有写任何实际的软件,所以我可能只是困惑而且答案很简单 - 如果是这样,抱歉浪费你的时间:) .

clojure

6
推荐指数
2
解决办法
574
查看次数