我正在开发一个c/c++/java代码的在线代码判断软件。
我想包括各种参数来判断代码,即编译时间,执行时间,内存使用,就像IDEONE API提供的一样。
在 LINUX 环境中编译/执行代码时如何提取这些参数?是否有任何特定命令?
还有其他参数可以用来判断代码吗?
我正在开发一个c/c++/java代码的在线代码判断软件。
我想包括各种参数来判断代码,即编译时间,执行时间,内存使用,就像IDEONE API提供的一样。
在 LINUX 环境中编译/执行代码时如何提取这些参数?是否有任何特定命令?
还有其他参数可以用来判断代码吗?
有一个time
命令可以为您提供二进制文件的执行时间。有了它,您可以获得编译时间time gcc code.c
,或执行时间,time ./a.out
。对于内存使用情况,您可以使用valgrind
或ps
。使用 ps,如果您使用标准输入进行输入,它应该很简单。只需启动应用程序,在后台以特定时间间隔运行 ps,然后将输入提供给应用程序。
你的问题中的判断动词有点奇怪(这可能太不精确了)。也许你的意思是评估?
假设评估的源代码是由最近的 GCC 编译器(即 GCC 的 4.7 或 4.8 版)编译的,并且您可以参数化(或只是重复)其编译,您可以考虑扩展和自定义GCC编译器以用于评估或度量目的。这可以直接通过 GCC 插件(痛苦地用 C 或 C++ 编码),或者通过MELT扩展(MELT 是一种用于扩展和定制 GCC 的领域特定语言)。
您需要做一些工作才能走这条路,因为您需要深入研究 GCC 内部。MELT 探针可能会帮助您更多地理解 Gimple 表示(在 GCC 内部)。您也可以尝试编译一些gcc -fdump-tree-all
生成许多转储文件的示例代码。
所以这个想法是,您将花费时间(几天,也许几周)来开发一个 MELT 扩展(例如在某个文件中shiven.melt
)用于分析、度量和评估目的,并且您将 [重新] 编译example.c
源代码,例如
gcc -fplugin=melt \
-fplugin-arg-melt-extra=shiven \
-fplugin-arg-melt-mode=shivenanalysis \
-c example.c
(当然你会添加其他编译器标志,例如-O -I/some/include/dir/
...)
然后,你可以做一个 MELT 扩展来测量编译代码的一些特性,比如函数的数量、基本块的数量、Gimple 指令的数量等。这将在编译时发生。您的 MELT 扩展名(在您的文件中shiven.melt
)可以例如在某个数据库中写入一些统计信息。
扩展 GCC 对 C、C++、Fortran、Ada .... 源代码有意义,但对 Java 来说意义不大(因为没有人使用 GCC 来编译 Java,即使gcj
存在,而且gcj
可能支持一些旧 Java 标准的子集)。
请订阅gcc-melt@googlegroups列表并在那里询问 MELT 相关问题。在订阅中明确提及您对 MELT 的兴趣(也许是您的问题)。