我有一个XSLT用于在浏览器中查看XML文件.XSLT是天真的编写,目前需要很长时间才能执行(几分钟).
我的XML文件大小适中(~1 MiB),而执行不同处理的同一文档的其他XSLT执行速度要快得多.所以我知道问题不在于XML的大小,而是我的XSLT.
如何进行性能分析和优化我的XSLT?
(在浏览器中执行复杂的XSLT是一个坏主意吗?我应该改为应用XSLT应用程序吗?)
我使用GNU make和我使用的自动变量,在$<,$^等我知道这$<仅仅是第一要义,并$^为所有的先决条件. 有没有办法获得第二个先决条件?
我想问一个问题,然后用我自己的答案跟进,但也看看其他人有什么答案.
我们有两个大文件,我们想同时从两个独立的线程中读取.一个线程将顺序读取fileA,而另一个线程将顺序读取fileB.线程之间没有锁定或通信,两者都按顺序读取,并且两者都立即丢弃它们读取的数据.
我们在Windows上使用此设置的经验非常差.两个线程的组合吞吐量大约为2-3 MiB/sec.驱动器似乎花费大部分时间在两个文件之间寻找后退和前进,大概在每次搜索后读取很少.
如果我们禁用其中一个线程并暂时查看单个线程的性能,那么我们可以获得更好的带宽(此机器约为45 MiB /秒).很明显,糟糕的双线程性能是操作系统磁盘调度程序的假象.
我们可以做些什么来改善并发线程读取性能? 也许通过使用不同的API或以某种方式调整操作系统磁盘调度程序参数.
一些细节:
在具有2GiB RAM的机器上,文件大小为2 GiB.出于这个问题的目的,我们认为它们不会被缓存并完美地进行碎片整理.我们使用了碎片整理工具并重新启动以确保这种情况.
我们没有使用特殊的API来读取这些文件.这种行为可以在各种沼泽标准API中重复,例如Win32的CreateFile,C的fopen,C++的std :: ifstream,Java的FileInputStream等.
每个线程在一个循环中旋转,调用read函数.我们改变了每次迭代从API请求的字节数,从1KiB到128MiB之间的值.改变这一点没有任何影响,因此在每次磁盘搜索之后,OS实际读取的数量不是由这个数字决定的.这正是应该期待的.
单线程和双线程性能之间的巨大差异在Windows 2000,Windows XP(32位和64位),Windows Server 2003以及使用和不使用硬件RAID5时都是可重复的.
如何使用Go的"外部函数接口"调出C函数?
常见问题解答中提到了此界面,但我无法在文档的其他地方看到它.
我已经定义了一个Java函数:
static <T> List<T> createEmptyList() {
return new ArrayList<T>();
}
Run Code Online (Sandbox Code Playgroud)
调用它的一种方法是这样的:
List<Integer> myList = createEmptyList(); // Compiles
Run Code Online (Sandbox Code Playgroud)
为什么我不能通过显式传递泛型类型参数来调用它?:
Object myObject = createEmtpyList<Integer>(); // Doesn't compile. Why?
Run Code Online (Sandbox Code Playgroud)
我Illegal start of expression从编译器中得到错误.
我O(log* N)在一本关于数据结构的书中遇到过这个术语.什么log*意思?我无法在Google上找到它,WolframAlpha 也不理解它.
如何在Clojure中创建递归匿名函数,而不是尾递归?
以下显然不起作用,recur仅用于尾递归函数.我也不愿意拖入y-combinator ..
((fn [n] (if (= 1 n) 1 (* n (recur (dec n))))) 5)
Run Code Online (Sandbox Code Playgroud) 我们有一个内部生成的DLL,我们有相关的存根LIB.
我们还有一个EXE,它使用这个DLL使用静态链接到DLL的LIB文件的简单方法(即,不是手动使用LoadLibrary).
当我们部署EXE时,我们希望为了混淆原因(根据客户的要求)更改DLL文件名.
我们怎么能这样做,以便我们的EXE仍然自动找到DLL?
我已经尝试重命名DLL和LIB文件(在它们构建为正常名称后),然后将EXE项目设置更改为与重命名的LIB链接.这在运行时失败,因为我猜DLL的名称被烘焙到LIB文件中,而不是简单地通过链接器猜测".lib"替换为".dll".
一般情况下,我们不希望将此混淆应用于DLL的所有用途,因此我们希望保留当前DLL项目输出文件.
我希望有一种方法可以编辑DLL的LIB文件,并用其他东西替换DLL文件的硬编码名称.在这种情况下,这可以完全在EXE项目中完成(可能作为预构建步骤).
更新:我发现延迟加载不起作用,因为我的DLL包含导出的C++类.看到这篇文章.
还有其他选择吗?
我嵌套了xsl:for循环:
<xsl:for-each select="/Root/A">
<xsl:for-each select="/Root/B">
<!-- Code -->
</xsl:for>
</xsl:for>
Run Code Online (Sandbox Code Playgroud)
在内部循环中,如何从外部循环中的当前节点访问属性?
我一直在发现自己写这样的代码:
<xsl:for-each select="/Root/A">
<xsl:variable name="someattribute" select="@SomeAttribute"/>
<xsl:for-each select="/Root/B">
<!-- Now can use $someattribute to access data from 'A' -->
</xsl:for>
</xsl:for>
Run Code Online (Sandbox Code Playgroud)
这不能很好地扩展,因为有时我需要访问几条信息并最终为每个部分创建一个变量.有没有更简单的方法?
当我运行我的Clojure程序并在执行期间出错时,我注意到REPL打印的消息只包含我执行的脚本中的顶级行号.我可以让它转储一个调用堆栈(它引用了Clojure代码的各种行号)吗?
例如:
user=> (load-file "test.clj")
java.lang.IllegalArgumentException: Wrong number of args (1) passed to: user$eval134$fn (test.clj:206)
user=>
Run Code Online (Sandbox Code Playgroud)
如果我知道的不仅仅是最高级别的电话会更好(第206行).