我开发了一个具有以下特征的Fortran代码:
代码变得非常大。尽管在这个阶段我试图得到正确的答案,但仍需要执行代码的速度。
到目前为止,我正在编写包含ERROR: message
或INFO: message
等标记的文本日志文件。但是写太多信息会减慢代码的速度。我知道在Java开发中我们使用log4j库来高效地编写日志文件,我们可以打开或关闭各种级别的日志记录。因此,一旦代码干净,我们就可以关闭低级别日志并保留高级日志。
我想知道其他程序员在Fortran 90 +中处理这个问题的最佳方法是什么。
答案 0 :(得分:2)
最简单的方法是创建一个整数变量verbose
并在执行时读取其值(从文件或通过命令行)。通过这样做,您可以创建不同的级别:
实施起来很简单:
IF(verbose >= 1) CALL OutputError(message)
IF(verbose >= 2) CALL OutputInfo(message)
等等。
答案 1 :(得分:2)
我正在使用以下预处理器宏来完成此任务(在MACROS.h
内):
#ifdef DEBUG
#define DWRITE write(*,*) __FILE__,__LINE__,
#define dwrite write(*,*) __FILE__,__LINE__,
#else
#define DWRITE !
#define dwrite !
#endif
在我的代码中,我有以下标题:
#define DEBUG
#include "MACROS.h"
...
dwrite 'An error occurred!'
这给我的文件和发生错误的行,并通过注释第一行我可以轻松地打开/关闭消息。
您可以轻松地将其扩展到不同的调试级别并写入文件......
答案 2 :(得分:0)
我见过人们在编译器级别实现日志记录的方式类似于Kyle Kanos的预处理器指令方法。不是fortran标准,但我知道可以用一些fortran编译器完成。
答案 3 :(得分:0)
我亲自创建了一个数据类型,该数据类型包含一个message
(字符数组)和一个处理消息的过程指针。它不是最有效的系统,但是消息是通过write(io%message, fmt_statement) fmt_variables
写入的,然后调用过程指针,即io%print(msgType, msgLog, message)
,例如io%print(error, debug, io%message)
。
type, private :: badLogger
character(128), private :: message = ""
! Note here that IO is an abstract interface elsewhere
! and that defaultPrint is some printing procedure that
! matches the IO interface
procedure(IO), private, pointer :: print => defaultPrint
end type badLogger
! Usage:
type(badLogger) :: io
write(io%message, *) "I love pizza!"
call io%print(comment, fun, io%message)
我最近读了pFLogger
。该项目的GitHub页面为https://github.com/Goddard-Fortran-Ecosystem/pFlogger/blob/master(请参见https://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/20170011091.pdf,https://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/20170011458.pdf),乍一看,它看起来非常有用。我还没有用过,但是我肯定会研究它的!
对不起,您的回复太迟了!希望这对某些人还是有帮助的!