2310d亚当1009

2023-10-15 02:20
文章标签 1009 2310d 亚当

本文主要是介绍2310d亚当1009,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文

考虑缓存CTFE结果的潜在新示例:只需在标准运行时函数中,包装它们即可.在模板实例周围使用属性取器,而不是声明变量.表明发射到目标文件,而不是在导入时重新计算.

ctfe缓存

SSDiscord聊天室发现了MartinNowakPhobos中编写的一些旧代码,带有一条奇怪的注释:它说它在自动返回函数中,包装一些ctfe,因此直到实际调用函数时,才会在函数体上运行语义.

dmd中,有各种叫语义可执行一大堆特别是包括,在函数中运行必要的CTFE,并在函数体中处理导入,甚至还会计算推导属性活动函数.

函数语义族一般是构建最昂贵的部分之一(特别是包括CTFE时),因此避免它可节省大量时间.

然而,对缓存ctfe,动(auto)函数并不是特别有趣,因为无论是编译还是导入,总是在调用函数时处理它的主体.

这与推导属性起作用的原因相同,使用函数时必须处理主体,因此不需要显式告诉编译器属性.也表明即使之前已完成结果已在目标文件中,使用时也会重新处理函数内的CTFE.

仅导入自动文件不会触发其函数体中的CTFE,但即使已预编译模块,导入并调用它时也会重新处理.

即使只是导入且从未使用过的全局变量,也总是计算它,这是对全局变量(不变还是枚举无区别)的改进,但它还不够好.

我想可导入一个函数调用它,仍可用预编译CTFE结果.
好吧,旧的代码注释和Walter一贯说的话,这里

推导属性会损害编译速度,这让我想到:是否现在可在导入非根模块的函数体上运行语义.
我做了一个测试来调查:

//ctfe.d
template thing() {string helper() {string s;foreach(i; 0 .. 50000)s ~= "ok";return s;}enum thing = helper;
}
//immutable getThing2 = thing!();
//enum getThing2 = thing!();
string getThing() {//import ctfe3; int a = "foo";return thing!();
}

主模块:

//ctfe2.d
import ctfe;
void main() {string s = getThing();//enum foo = getThing() ~ "lol";
}

经过调整,导入模块中的追加循环,要花一秒的编译时间.编译速度与构建行数无关,而与你如何处理它们有关.

dmd(及LDCGDC)中,CTFE~=操作符有个可怕的实现,所以使用它,很容易破坏你的编译时间.一般,应避免使用它.

现在可通过观察编译时间来判断是否运行CTFE.很容易区分,一秒构建与大约1/10秒构建.

故意让int a="foo"的类型不匹配;或导入不存在模块也是确认未运行语义,也是在运行语义时,生成这些错误.

我在此注释掉它们以编译模块,如果不注释它,则仅导入时不会生成错误!

关键是,当前dmd实现中,在本次导入未编译的模块,即非根模块中会完全跳过非模板非自动返回的函数体.
当然,会令牌化它们,并至少经过最低限度解析,来知道函数何时结束,但没有语义分析,没有ctfe,没有代码生成,跳过了构建昂贵部分.

但是,有时它们非常昂贵!getThing中的该ctfe就是一例,除非绝对必要,否则确实不想再次运行语义.我想我会修改推导属性提案,以添加方法抑制推导属性,并保留当前行为.

今天已解决di问题.

再次看测试:

template thing() {string helper() {string s;foreach(i; 0 .. 50000)s ~= "ok";return s;}enum thing = helper;
}
string getThing() {return thing!();
}

实际计算ctfe,还有几层,与助手函数一样:一个包装器模板,然后是一个包装器标准函数.它们类似,但一个在编译时,一个在运行时.
包装器模板编译时缓存CTFE结果.用相同参数再次引用模板时,编译器会从内存缓存中拉回缓存结果.

它还抑制生成助手函数代码,避免在目标文件中的运行时使用,并避免编译器浪费时间在上面生成代码.

然后,包装器属性,注意它有个显式返回类型,导致在目标文件中输出ctfe结果,而下次导入模块时,会跳过正文,不会再执行模板+ctfe;相反从预编译文件中引用它.

但是,如果确实想用CTFE的结果,函数体仍在且可按需使用,但要为每次编译再支付CTFE成本.

因此,它不会按单独编译CTFE单元可重用方式来缓存它,但确实适合只是在代码中正常调用函数的用户.

这是个相当不错的结果,在今天编译器中可用,且仅微小的调整了代码.
单独编译,最大好处是,如果有非常昂贵的东西及一个非常基本的公共接口.
如果生成代码来把Web接口或脚本语言粘合在一起,则归结为在公共接口中查找来生成函数,则可通过这些基本函数来来再次生成构建代码.

即使函数体很昂贵,如果遵循上面规则,则不会处理这些函数体.

这篇关于2310d亚当1009的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/214723

相关文章

2015 Multi-University Training Contest 5 1009 MZL#39;s Border

MZL's Border  Problem's Link:  http://acm.hdu.edu.cn/showproblem.php?pid=5351   Mean:  给出一个类似斐波那契数列的字符串序列,要你求给出的f[n]字符串中截取前m位的字符串s中s[1...i] = s[s.size()-i+1....s.size()]的最大长度。 analyse:   过计算

HDU 1009(贪心)

题意:老鼠一共有m斤猫食,xxx一共有n个仓库。每个仓库有a b两种数据,a表示当前仓库一共有多少斤鼠食,b表示当前仓库要换a斤鼠食要多少猫食。求老鼠最多能换多少食物。 第一组数据是m n,接下来一共有n组数据,每组是对应仓库的a b。     #include <iostream>#include <cstring>#include <cstdio>#include <algori

NYOJ--1009 So Easy[Ⅰ]

So Easy[Ⅰ] 时间限制: 1000 ms  |  内存限制: 65535 KB 难度:2 描述 给出任意一个三角形的三个边a,b,c。 要求:求出这个三角形的外接圆半径。 输入 输入数据有多组。 每行有三个数a,b,c(0<a,b,c<100) 输出 输出一行单独的一个数表示三角形的的外接圆半径,输出保留两位小数。(不要输出多余的信息) 样例输入 3 4 5

Ural 1009 K-based Numbers(DP)

题目地址:Ural 1009 DP水题。。二维DP,第一维只用0和1来表示0和非零就可以。 代码如下: #include <iostream>#include <cstdio>#include <string>#include <cstring>#include <stdlib.h>#include <math.h>#include <ctype.h>#include <q

奋战杭电ACM(DAY5)1009

又干了一题,今天感觉不错呀!再接再厉!晚上继续!! 不知不觉原来用到了昨天看的贪心算法~~~用了才知道这个算法就是贪心,看来还不熟练,继续加油练习!! FatMouse' Trade #include <iostream>#include <iomanip>using namespace std;int main(){int M,N,i,k;double javabean,tmp

【PAT】【Advanced Level】1009. Product of Polynomials (25)

1009. Product of Polynomials (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue This time, you are supposed to find A*B where A and B are two pol

BZOJ 1009 GT考试 DP+矩阵快速幂

dp[i][j]表示长度为i,匹配了j个的方案数,压缩成矩阵,转移即可。 #include <cstdio>#include <cstring>using namespace std;struct Mat{int a[22][22];};Mat I, A;int n, m, mod;char s[22], ss[22];Mat mul(Mat& x, Mat& y){Ma

hodj 1009 FatMouse' Trade--贪心算法

整体思路:整体思路就是以 JavaBean/CatFood比为基准,比值大的房间优先。使用结构体排序,结构体排序。 #include <iostream>#include <algorithm>#include <string>#include <map>#include <stdio.h>using namespace std;struct trade{double a;//Ja

九度oj-1009-二叉搜索树

时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4464 解决:1999 题目描述: 判断两序列是否为同一二叉搜索树序列 输入: 开始一个数n,(1<=n<=20) 表示有n个需要判断,n= 0 的时候输入结束。 接下去一行是一个序列,序列长度小于10,包含(0~9)的数字,没有重复数字,根据这个序列可以构造出一颗二叉搜索树。 接下去的n行有n个序列

PAT-1009 说反话(java实现)

还是这种题好,多简单啊,题目多清晰明了啊,多让人增加学习的热情啊。 题目 给定一句英语,要求你编写程序,将句中所有单词的顺序颠倒输出。 输入格式: 测试输入包含一个测试用例,在一行内给出总长度不超过 80 的字符串。字符串由若干单词和若干空格组成,其中单词是由英文字母(大小写有区分)组成的字符串,单词之间用 1 个空格分开,输入保证句子末尾没有多余的空格。 输出格式: 每个测试用例的输