新版本的 Delphi 有System.Hash,但旧版本如 Delphi 7 没有。
Delphi 哪个版本引入了该System.Hash单元?
在典型的 servlet 环境中,每个请求都有自己的线程。添加日志记录 MDC 来为请求生成唯一的请求 ID 可以通过简单的 servlet 过滤器来实现。
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
try {
String requestId = UUID.randomUUID().toString();
HttpServletResponse httpServletResponse = (HttpServletResponse)response;
httpServletResponse.setHeader("requestId", requestId);
MDC.put("requestId", requestId);
chain.doFilter(request, response);
} finally {
MDC.remove("requestId");
}
}
Run Code Online (Sandbox Code Playgroud)
日志记录配置。
<Pattern>%d %-5level %X{requestId} [%t] %C{10}:%L %m%n</Pattern>
Run Code Online (Sandbox Code Playgroud)
样本记录。
2024-02-04 10:29:55,160 INFO 99cd4d64-5d7c-4577-a5d3-cb8d48d1dfd5 [http-nio-8080-exec-6] c.s.q.UserController:65 Deleteing user 'test'
2024-02-04 10:29:55,260 INFO 99cd4d64-5d7c-4577-a5d3-cb8d48d1dfd5 [http-nio-8080-exec-6] c.s.q.UserController:70 Successfully deleted user 'test'
Run Code Online (Sandbox Code Playgroud)
对于 Java 21+ 中的虚拟线程,我的印象是线程可以在等待任何 IO 时自动挂起请求,并且线程可以开始处理其他请求。在这种情况下,当线程开始服务其他请求时,日志记录 MDC 似乎可以“渗入”其他请求日志。如何解决这个问题,以便我可以继续将唯一值添加到每个请求的日志记录语句中?
我正在尝试 nim 并在处理序列时与奇怪的行为作斗争。
如果我运行这段代码:
var
hobbies = @["Coding", "Creating", "Sports"]
echo hobbies
hobbies.add("Nature")
echo hobbies
hobbies.del(0)
echo hobbies
Run Code Online (Sandbox Code Playgroud)
我期望这个输出,因为我认为它像队列一样工作:
@["Coding", "Creating", "Sports"]
@["Coding", "Creating", "Sports", "Nature"]
@["Creating", "Sports", "Nature"]
Run Code Online (Sandbox Code Playgroud)
但我得到了这个:
@["Coding", "Creating", "Sports"]
@["Coding", "Creating", "Sports", "Nature"]
@["Nature", "Creating", "Sports"]
Run Code Online (Sandbox Code Playgroud)
通过索引删除后.del(0)值"Nature"切换到索引0。
难道不应该保留订单吗?
版本:
Nim Compiler Version 1.6.14 [Linux: amd64]
Compiled at 2023-06-29
Run Code Online (Sandbox Code Playgroud) 我刚刚发现 具有Instant#ofEpochSecond(epochSecond)最小值/最大值。
这里是源代码。
// Instant.java
/**
* The minimum supported epoch second.
*/
private static final long MIN_SECOND = -31557014167219200L;
/**
* The maximum supported epoch second.
*/
private static final long MAX_SECOND = 31556889864403199L; // << I WANT THIS VALUE!
Run Code Online (Sandbox Code Playgroud)
我如何以MAX_SECOND编程方式获取?
我试图弄清楚Range,
final var range = ChronoField.INSTANT_SECONDS.range();
log.debug(" minimum: {}", range.getMinimum());
log.debug(" largestMinimum: {}", range.getLargestMinimum());
log.debug(" maximum: {}", range.getMaximum());
log.debug("smallestMaximum: {}", range.getSmallestMaximum());
Run Code Online (Sandbox Code Playgroud)
并且没有运气。
03:53:36.120 [ main] DEBUG - minimum: -9223372036854775808
03:53:36.122 [ main] …Run Code Online (Sandbox Code Playgroud) 我仍在与在密集、单精度、Fortran 排序的二维数组中查找非零条目的索引(和相应值)i的问题作斗争。我通过 Python 使用 Cython,中间有一些 C。j
我提前道歉,因为这篇文章将会非常长。
我必须处理数千个(有时数百万个)中型 2D 数组(有时 700 x 1,000,有时 6,000 x 7,000 等等),这些数组非常稀疏,但它们提供为密集的(密度可以低至 0.02% 和高达 1-2%)。这些矩阵有时具有某种结构,但通常这是不可预测的。
我尝试过 numpy.nonzero 和 Scipy稀疏的东西,但不幸的是它们比我的慢。
我问这个问题是为了看看我的(可能不正确的)代码的性能是否有可能改进- 即,使其更快 - 而且也可以从更有经验的人那里学习新东西。
我对 Cython 的熟练程度非常有限。我对 C 的了解很糟糕(实际上几乎为零)。我所知道的关于 SIMD 指令的一切都可以用大字写在邮票上。
我在 StackOverflow 上来回搜索并找到了类似问题的答案,其中许多问题都使用了非常先进的 SIMD 解决方案。但由于我对 SIMD 一无所知,因此我无法修改它们以满足我的需要。
我使用这些标志编译下面发布的 Cython 脚本:
-O3 -ffast-math -funroll-loops -ftree-vectorize …Run Code Online (Sandbox Code Playgroud) 我在某处读到这是因为 onEach 没有根据发出的值执行任何处理,但它只是改变它们;但是collect很可能对收集到的值执行一些异步或繁重的任务,这可能会阻塞线程。
这对我来说似乎不正确;如果我们对 onEach 函数中的值执行一些繁重的任务并且它有可能阻塞线程怎么办?
动机:尝试迁移虚拟线程。
问题:尽管虚拟线程很便宜,但操作系统可能会发现同时堆叠某些进程很可疑,例如在网络上搜索 IP 或端口。
我使用下面的代码来限制线程的创建。TS_NetworkIPUtils TS_NetworkPortUtils
var executor = useVirtualThread
? Executors.newVirtualThreadPerTaskExecutor()
: Executors.newFixedThreadPool(MAX_THREAD_COUNT());
Run Code Online (Sandbox Code Playgroud)
是否可以创建一个执行器服务来创建虚拟线程并同时具有限制功能?
很多教程都使用下面的例子来解释生命周期(包括官方的),但我认为它们都没有真正解释幕后发生的事情。
fn x_or_y<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
}
else {
y
}
}
Run Code Online (Sandbox Code Playgroud)
官方教程是这么说的:
这表示 x 和 y 在同一范围内都有效,并且返回值在该范围内也有效。
但为什么x 和 y 都在同一范围内有效?
x如果我在调用此函数后立即销毁但y不理会,那么x寿命会比y.
他们如何在相同的范围内生存?我认为这种说法根本就是错误的。
或者,这是否意味着程序员有责任确保具有相同生命周期说明符的参数必须具有相同的生命周期?
但如果是这样的话,为什么编译器允许不同生命周期的参数具有相同的说明符呢?为什么它不帮我们检查一下?
例如,在下面的代码中,x和y具有不同的生命周期,但我可以给它们两个说明符'a:
// This does NOT compile.
let x = String::from("abcd");
let y = String::from("abc");
let result = x_or_y(x.as_str(), y.as_str());
drop(y); // y's …Run Code Online (Sandbox Code Playgroud) 我想知道为什么这段代码:
size_t hash_word(const char* c, size_t size) {
size_t hash = uchar(c[0]);
hash ^= uchar(c[size - 1]);
hash ^= uchar(c[size - 2]);
return hash;
}
Run Code Online (Sandbox Code Playgroud)
编译时:
movzbl -1(%rcx,%rdx), %eax
xorb -2(%rcx,%rdx), %al
xorb (%rcx), %al
movzbl %al, %eax <-
ret
Run Code Online (Sandbox Code Playgroud)
结果是第二条 movzbl 行。
我转换为asmg++ -Wall -O3 -S file.cpp
按照我的理解,%eax 的所有高位应该已经从第一个 movzbl 开始设置为零。那么下面的两个 xorb 不应该修改任何高位,因为它只触及 %al 中的位。那么为什么还需要额外的说明呢?不是应该在前三个之后再做吗?
假设您有一个structwith 元素,您不想(不能)在初始化阶段初始化它,但它不是默认可初始化的。我想出了一种使用方法std::launder:为结构分配一个空间,然后使用洗衣槽在正确的位置分配一个值。例如,
#include <cassert>
#include <cstddef>
#include <iostream>
#include <new>
struct T {
int t;
};
struct S {
int x;
T t;
S() = delete;
S(int x) : x(x) {}
};
int main() {
alignas(S) std::byte storage[sizeof(S)];
S s0(42);
// 0. I believe that the commented line is dangerous, although it compiles well.
// *std::launder(reinterpret_cast<S*>(storage)) = s0;
S *ps = std::launder(reinterpret_cast<S*>(storage));
ps->x = 42;
ps->t = T{};
{ // 1. Is this safe?
S …Run Code Online (Sandbox Code Playgroud)